Activity的启动模式分为两种:
1.显式调用,直接设置指定的类名即可启动,如:
Intent intent = new Intent(MainActivity.this, ClassicActivity.class);
startActivity(intent);
2.隐式调用。通过在AndroidManifest文件中为activity配置过滤信息来匹配到指定的activity:
<activity android:name=".activity.book.IntentFilterActivity">
<intent-filter>
<action android:name="android.intent.action.super"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
Intent intent1 = new Intent();
intent1.setAction("android.intent.action.super");
startActivity(intent1);
隐式调用有什么特点,为什么要使用它?
- 通过在清单文件中配置IntentFilter来实现的,它一般没有明确指出目标组件名称
- 用于在不同应用程序之间
- 降低程序的耦合度,但效率更低。
- 如果不希望当前隐式intent被跨应用启动,只需要在AndroidManifest.xml对应的activity中配置android:exported="false"即可。
关于匹配规则intent-filter需要注意:
·一个activity可以有多个匹配规则
·一个activity的匹配规则必须完全匹配才能被启动
·action、category、data可以单独设置,也能同时设置
intentFilter中的过滤信息有action、category、data等过滤规则,分别有其各自的作用。
1. action。
一个字符串,支持自定义,系统会设置一些自己的aciton,比如ACTION_SEND,发送邮件Action_CALL,呼叫指定的电话号码ACTION_DIAL,拨打电话等等。Intent中的action只有一个和过滤规则中的一个相同即可匹配成功。
经本人代码测试,intentFilter设置了action后,也必须设置category,否则会报匹配失败无法找到对应的activity。
2. category。
一个字符串,支持自定义,系统也设置了一些默认category。
category要求intent中的所有的规则和intent-filter中的相同,即多对多的关系,否则匹配失败。 而intent-filter设置多余的category则不影响匹配结果。
<intent-filter>
<action android:name="android.intent.action.super"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.DEFAULT1"/>
</intent-filter>
Intent intent1 = new Intent();
intent1.setAction("android.intent.action.super");
intent1.addCategory("android.intent.category.DEFAULT");
startActivity(intent1);
3. data 。即数据,主要包含两部分,mimeType和URL(Schheme,Host,Port,Path,PathPattern,pathPrefix)。
设置方法和action类似,必须有相同的data和intent中设置的一致才匹配成功。
<data android:scheme="com.android.demo" android:host="abc" android:port="8080" android:mimeType="image/*"/>
intent1.setDataAndType(Uri.parse("com.android.demo://abc:8080"),"image/png");
startActivity(intent1);
注意:
因activity需要设置启动规则还要考虑过滤条件,因此建议用显示启动方式,启动组件。