前言
大家应该都知道,隐式意图共有三个大的匹配规则,它们分别是:action、category、data,我认为action与category的匹配规则比较像,且相对比较简单为一篇,而data匹配规则,多且复杂,所以将它单列一篇。
action的匹配规则
- 如果是隐式意图启动Activity,那么Intent中必须至少有一个action;
- Intent中的action必须能够与过滤规则中的action完全匹配,这里的匹配是指完全一样;
- 过滤规则中可以有多个action,只有Intent中的action都能够与过滤规则中的action完全匹配,才能匹配成功,否则均视为失败。
category的匹配规则
- Intent中可以没有category,当Intent中没有category时,startActivity()会在Intent中默认添加一个category(“android.intent.category.DEFAULT”);
- 如果Intent中有category,那么它必须是过滤规则中声明过了,且所有的category必须都是过滤规则中的category。
下面贴几个正确的例子和错误的例子
FirstActivity在manifest文件中声明的代码如下:
<activity android:name=".FirstActivity">
<intent-filter>
<action android:name="com.itlong.myimplicitintent.FIRSTACTIVITY"/>
<action android:name="com.itlong.myimplicitintent.TEST"/>
<category android:name="com.itlong.myimplicitintent.MYCATEGORY"/>
<category android:name="com.itlong.myimplicitintent.TESTCATEGORY"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
- 只有action,没有category,成功启动activity,分为Intent中只有一个action,和有两个action;
Intent intent = new Intent ("com.itlong.myimplicitintent.FIRSTACTIVITY");
startActivity (intent);
Intent intent = new Intent ("com.itlong.myimplicitintent.TEST");
startActivity (intent);
Intent intent = new Intent ("com.itlong.myimplicitintent.FIRSTACTIVITY");
intent.setAction ("com.itlong.myimplicitintent.TEST");
startActivity (intent);
- 只有action,没有category,启动activity失败,分为Intent中只有一个action且是错误的,有两个action且有其中一个action是错误的,有两个action且两个都是错误的;如果你启动成功了,说明手机里面有声明了这里给出错误的action的Activity;
Intent intent = new Intent ("com.itlong.myimplicitintent.FRSTACTIVITY");
startActivity (intent);
Intent intent = new Intent ("com.itlong.myimplicitintent.TEXT");
startActivity (intent);
Intent intent = new Intent ("com.itlong.myimplicitintent.FIRSTACTIVITY");
intent.setAction ("com.itlong.myimplicitintent.TEXT");
startActivity (intent);
Intent intent = new Intent ("com.itlong.myimplicitintent.FRSTACTIVITY");
intent.setAction ("com.itlong.myimplicitintent.TEST");
startActivity (intent);
Intent intent = new Intent ("com.itlong.myimplicitintent.FRSTACTIVITY");
intent.setAction ("com.itlong.myimplicitintent.TEXT");
startActivity (intent);
- 既有action,又有category,action的情况已说清楚,这里action是“com.itlong.myimplicitintent.FIRSTACTIVITY”常量,只分析category的情况,可以分为只添加一个category,添加了两个category,成功启动Activity。
Intent intent = new Intent ("com.itlong.myimplicitintent.FIRSTACTIVITY");
intent.addCategory ("com.itlong.myimplicitintent.MYCATEGORY");
startActivity (intent);
Intent intent = new Intent ("com.itlong.myimplicitintent.FIRSTACTIVITY");
intent.addCategory ("com.itlong.myimplicitintent.TESTCATEGORY");
startActivity (intent);
Intent intent = new Intent ("com.itlong.myimplicitintent.FIRSTACTIVITY");
intent.addCategory ("com.itlong.myimplicitintent.MYCATEGORY");
intent.addCategory ("com.itlong.myimplicitintent.TESTCATEGORY");
startActivity (intent);
- 既有action,又有category,action的情况已说清楚,这里action是“com.itlong.myimplicitintent.FIRSTACTIVITY”常量,只分析category的情况,可以分为只添加一个category且是错误的,添加了两个category其中一个是错误的,添加两个category两个都是错误的,启动Activity失败。
Intent intent = new Intent ("com.itlong.myimplicitintent.FIRSTACTIVITY");
intent.addCategory ("com.itlong.myimplicitintent.MCATEGORY");
startActivity (intent);
Intent intent = new Intent ("com.itlong.myimplicitintent.FIRSTACTIVITY");
intent.addCategory ("com.itlong.myimplicitintent.TEXTCATEGORY");
startActivity (intent);
Intent intent = new Intent ("com.itlong.myimplicitintent.FIRSTACTIVITY");
intent.addCategory ("com.itlong.myimplicitintent.MCATEGORY");
intent.addCategory ("com.itlong.myimplicitintent.TESTCATEGORY");
startActivity (intent);
Intent intent = new Intent ("com.itlong.myimplicitintent.FIRSTACTIVITY");
intent.addCategory ("com.itlong.myimplicitintent.MYCATEGORY");
intent.addCategory ("com.itlong.myimplicitintent.TEXTCATEGORY");
startActivity (intent);
Intent intent = new Intent ("com.itlong.myimplicitintent.FIRSTACTIVITY");
intent.addCategory ("com.itlong.myimplicitintent.MCATEGORY");
intent.addCategory ("com.itlong.myimplicitintent.TEXTCATEGORY");
startActivity (intent);
注意事项及总结
- 使用隐式意图启动Activity时,Intent对象必须包含至少一个action;
- 使用饮隐式意图启动Activity时,该Activity在manifest文件中声明时,必须添加默认的category,否则会报错
- 我自己总结就是action与category过滤方式是一样的,只不过隐式意图启动时,Intent对象中action是至少要有一个,category是可有可无的,当没有category时其实是系统内部帮我们添加了一个默认的category。
- action与category的匹配是一样区分大小写。