赞
踩
对于Android Intent大家肯定不陌生,Intent顾名思义就是“意图”的意思。其实这个“意图”有点不好理解。其实简单点就是我想要“干什么”。你比如说,我想要“去火车站”、我想要“启动一个Activity”、我想要“启动一个server”、我想要XXX都是意图。Intent有显式Intent和隐式Intent两种情况。
那么问题来了:
一.那到底什么样的Intent是显式的Intent,什么样的Intent是隐式的Intent呢?
为了回答这个问题,请看下面对于隐式Intent和显式Intent的具体介绍
1 隐式Intent
说起隐式Intent就不得不先说在清单文件(AndroidManifest.xml)中的intent-filter。你随便创建一个Android 项目都会在清单文件中看见intent-filter,顾名思义就是Intent的过滤器。而且一个Activity组件的声明中,可以有多个intent-filter。当然也可以没有intent-filter。
举个例子如下:
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.mytest">
-
- <application
- android:allowBackup="true"
- android:icon="@mipmap/ic_launcher"
- android:label="@string/app_name"
- android:roundIcon="@mipmap/ic_launcher_round"
- android:supportsRtl="true"
- android:theme="@style/AppTheme">
- <!--1个intent-filter-->
- <activity android:name=".MainActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
-
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
-
- <!--没有intent-filter-->
- <activity android:name=".Main2Activity" />
-
- <!--多个intent-filter-->
- <activity android:name=".Main3Activity">
- <intent-filter>
- <action android:name="com.mytest.MyIntentAction" />
-
- <category android:name="android.intent.category.DEFAULT" />
-
- <data android:mimeType="aa/bb"/>
- </intent-filter>
- <intent-filter>
- <action android:name="com.mytest.MyIntentAction1" />
-
- <category android:name="android.intent.category.DEFAULT" />
-
- <data android:scheme="myIntent1" android:host="8080"/>
- </intent-filter>
- <intent-filter>
- <action android:name="com.mytest.MyIntentAction2" />
-
- <category android:name="android.intent.category.DEFAULT" />
-
- <data android:scheme="myIntent2"/>
- </intent-filter>
- </activity>
- </application>
-
- </manifest>

讲完了AndroidManifest.xml中的Intent-filter.就要看一下如何在代码中一个隐式的Intent,去启动一个组件。下面我们来看一个代码例子,我创建了一个Android 项目,除了默认的MainActivity我又增加了两个Activity:Main2Activity、Main3Activity。
其中Main2Activity由MainActivity启动,暂时不看启动Main2Activity的代码,现在我们先看在Main2Activity中使用隐式的Intent启动Main3Activity的代码。根据AndroidManifest.xml中Main3Activity的声明来看,有三个intent-filter可以启动Main3Activity,所以我随机选一个intent-filter进行Intent的设置就可以了。我选用第三个intent-filter来启Main3Activity。
- <intent-filter>
- <action android:name="com.mytest.MyIntentAction2" />
-
- <category android:name="android.intent.category.DEFAULT" />
-
- <data android:scheme="myIntent2"/>
- </intent-filter>
- package com.mytest;
-
- import android.content.Intent;
- import android.net.Uri;
- import android.support.v7.app.AppCompatActivity;
- import android.os.Bundle;
-
- public class Main2Activity extends AppCompatActivity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main2);
-
- //创建隐式Intent
- Intent intent = new Intent();
-
- //为隐式Intent添加过滤Action,Data和Category的字段,
- // 不是说必须这三个字段同时有,这个设置那些是根据清单文件中Main3Activity的某一个intent-filter确定的
- intent.setAction("com.mytest.MyIntentAction2");
- intent.addCategory("android.intent.category.DEFAULT");
- intent.setData(Uri.parse("myIntent2:" + 110));//后边的110是随便加的,暂时没有什么具体的意思,这就是他的一个用法
-
- //启动Main3Activity
- startActivity(intent);
- }
- }

2 显式Intent
其实显式Intent就很简单了,我们直接来看代码。我在MainActivity.java中使用显式Intent启动Main2Activity,代码如下
- package com.mytest;
-
- import android.content.Intent;
- import android.support.v7.app.AppCompatActivity;
- import android.os.Bundle;
-
- public class MainActivity extends AppCompatActivity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
-
- //创建显示Intent
- Intent intent = new Intent(getApplicationContext(),com.mytest.Main2Activity.class);
-
- //启动Activity
- startActivity(intent);
- }
- }

这就是显式的Intent去启动组件。
总的一句话,如果创建Intent的时候,明确指出了要启动的class的名字,就是显示Intent。如果没有明确的指出要启动的class的名,而是通过设置intent的过滤字段启动class,就是隐式Intent.
二.什么时候用显示Intent,什么时候用隐式Itent呢?
一句话:当你启动自己写的同一个APP中的Activity时使用显示Intent,当你要启动其他人写APP中的Activity时使用隐式Intent。
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。