以Activity为例,Android的Activity的InterFilter一共有三种:action、category、data。我们用Intent隐式启动时需要根据Activity的这三种标签进行匹配。Service与BroadcastReceiver同理。
匹配规则
一.action
action的匹配规则分为两种情况:
1.没有data标签,或者说只有action和category标签时,action要求Intent的action必须存在且和<intent-fileter>中的其中一个action相同。
2.有data标签时,Intent只需要指定data标签(startActivity或startActivityForResult时系统默认加上android.intent.category.DEFAULT标签,相当于有category和data两种标签)即可,无需指定action,当然指定也没问题。
二.category
1.需要隐式启动的Activity必须在<intent-fileter>中加上android.intent.category.DEFAULT标签;
2.Intent只加category标签启动Activity会报错,必须配合action或者data使用;
3.Intent若未添加category标签,startActivity或者startActivityForResult时会默认加上android.intent.category.DEFAULT标签。
4.Intent若含有category,则所有的category都必须与<intent-fileter>中的其中一个相同。
三.data
1.Activity若含有data标签,则Intent必须要有与之匹配的data。
2.data的语法:
<data android:scheme="string"
android:host="string"
android:port="string"
android:path="string"
android:pathPattern="string"
android:pathPrefix="string"
android:mimeType="string"/>
Scheme:URI的模式。
Host:URI主机名
Port:URI端口号
Path、pathPattern、pathPrefix:表述路径信息,path标识完整的路径信息;pathPattern也表示完整路径信息,但是它里面可以包含通配符"",""表示0个或多个任意字符;pathPrefix表示路径的前缀信息。
其中string代表字符串,如android:mimeType="image/*",data标签可以只有android:mimeType。如:
<data android:mimeType="image/*"/>
此时虽然没有指定URI,但是Intent中的URI默认是content或者file才能匹配。