Android隐式Intent记录

最近研究 Android 原生分享,深入了解了一下隐式 Intent,平常 App 内跳转,常用的是显示 Intent,隐式 Intent 常见的就是 App 启动页设置,下面的代码相信大家都很熟悉,只是没想到习以为常的背后隐藏着小小的知识点。

1
2
3
4
5
6
7
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

隐式 Intent

官方介绍:

创建隐式 Intent 时,Android 系统通过将 Intent 的内容与在设备上其他应用的清单文件中声明的 Intent-Filter 进行比较,从而找到要启动的相应组件。 如果 Intent 与 Intent-Filter 匹配,则系统将启动该组件,并向其传递 Intent 对象。 如果多个 Intent 过滤器兼容,则系统会显示一个对话框,支持用户选取要使用的应用。

隐式 Intent 既可以启动当前应用的组件,也可以启动其他应用的组件。

启动其他应用组件

  • 目标 activity 配置(其他应用)
1
2
3
4
5
6
7
8
<activity
android:name=".IntentActivity"
android:label="IntentActivity">
<intent-filter>
<action android:name="com.example.IntentDemo.action.a" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
  • Intent 代码:(当前应用)
1
2
3
4
5
6
7
8
9
10
11
// 启动其他应用的Activity
Intent intent = new Intent();
//action
intent.setAction("com.example.IntentDemo.action.a");
//Category可以不设置,因为一般在AndroidManifest.xml会设置Default,startActivity方法中也会默认添加Default。
if (intent.resolveActivity(getPackageManager()) != null) {
LogUtils.e("match success");
startActivity(intent);
} else {
LogUtils.e("match failure");
}

IntentFilter 匹配规则

隐式 Intent 调用分为两部分,一部分是 AndroidManifest 中组件的配置,一部分是Intent 对象的构建。
当构建的 Intent 对象符合目标组件的配置的时候,才能成功启动目标组件。
过滤信息有三种,分别是:

  • action
  • category
  • data

IntentFilter 中的 action、category 和 data 可以有多个,只有一个 Intent 同时匹配 action、category、data 才算完全匹配,只有完全匹配才能成功启动 Activity。

另外一点,一个activity中可以有多个 Intent-filter,一个 Intent 只要能匹配任何一组 Intent-filter 即可成功启动对应的activity。

隐式Intent解析