在 Android 中使用 Intent 启动 Activity 时, category 不是必须的,但 data 是必须的。如果Intent中设置了data,则必须在 AndroidManifest.xml 中进行相应配置,否则启动会失败12。
Intent 与 清单文件 的匹配规则
Action和Category:
Action:Intent中必须指定action,且intent中的action必须与intent-filter中的action完全一致(包括大小写)。如果intent中没有指定category,系统会自动添加android.intent.category.DEFAULT,如果没有这个category,匹配会失败2。
Category:intent-filter中可以有多条category,intent中也允许有多条category。所有intent中的category必须在intent-filter中找到对应的category才算匹配成功2。
Data:
Data:intent中只能设置一个data,如果intent-filter中指定了data,则intent中也必须指定其中的一个data。setType会覆盖setData,反之亦然,因此需要使用setDataAndType方法来同时设置data和mimeType23。
示例代码
java
Intent intent = new Intent();
intent.setAction("com.action.456");
intent.addCategory("android.intent.category.DEFAULT"); // 即使代码里不写,系统也会默认添加
intent.setData(Uri.parse("http://456"));
startActivity(intent);
xml
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.action.123" />
<action android:name="com.action.456" />
<category android:name="android.intent.category.DEFAULT" />
<data android:host="456" android:scheme="http" />
</intent-filter>
</activity>