intent作为连接Android中四大组件的桥梁,在隐式intent中时通常需要进行匹配,这就要求我们对intent-filter的匹配规则有一定了解,intent-filter通常包括三部分,aciton、category、data
<activity android:name="dbh.leo.com.intentfilter.MyActivity">
<intent-filter>
<action android:name="com.leo.a"/>
<action android:name="com.leo.b"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="com.leo.c"/>
<category android:name="com.leo.d"/>
<data android:mimeType="text/plain"/>
</intent-filter>
</activity>
下面针对这三个部分分别进行介绍:
1.action的匹配规则
我们知道action是一个字符串,系统默认帮我们定义了一些action,同时我们也可以自定义。字符串中的字母是严格区分大小写的,这个在匹配的时候是要注意的。关于action的匹配很简单,我们可以直接总结归纳一下:
Intent中必须存在action,这一点和category不同;
action的字符串严格区分大小写,intent中的action必须和过滤规则中的action完全一致才能匹配成功;
匹配规则中可以同时有多个action,但是Intent中的action只需与其中之一相同即可匹配成功;
2.category的匹配规则
和action一样,category也是一个字符串,系统同样默认定义了一些,我们一样可以自定义。其实category的匹配规则和action有很强的可比性,所以我们可以完全类比action来进行总结
匹配规则中必须添加“android.intent.category.DEFAULT”这个过滤条件(原因后面会介绍)
Intent中可以不设置category,这个时候你必须是使用startActivity或者startActivityForResult的时候(原因也在后面)
Intent中可以同时设置多个category,一旦设置多个catrgory,那么每个category都必须能够和过滤条件中的某个category匹配成功.(相比之下,action只需要有一个匹配成功即可)
3.data的匹配规则
在介绍data的匹配之前,我觉得还是有必要再温故一下data的结构吧
<data android:scheme="string"
android:host="string"
android:port="80"
android:path="/string"
android:pathPattern="string"
android:pathPrefix="/string"
android:mimeType="text/plain"/>
总的来说data包含两部分:mimeType和URI。
mimeType表示image/ipeg,video/*等媒体类型
URI信息量相对大一点,其结构一般为:
<scheme>://<host>:<port>/[<path>|<pathPrefix|<pathPattern>>]
下边讲分别来介绍下各个节点数据的含义
scheme:整个URI的模式,如常见的http,file等,注意如果URI中没有指定的scheme,那么整个uri无效
host:URI的域名,比如我们常见的www.mi.com,www.baidu.com,与scheme一样,一旦没有host那么整个URI也毫无意义;
port:端口号,比如80,很容易理解,只有在URI中指定了scheme和host之后端口号才是有意义的;
path,pathPattern,pathPrefix包含路径信息,path表示完整的路径,pathPattern在此基础上可以包含通配符,pathPrefix表示路径的前缀信息;
其实data的匹配规则和action也有点类似:
Intent中必须有data数据;
Intent中的data必须和过滤规则中的某一个data完全匹配;
过滤规则中可以有多个data存在,但是Intent中的data只需匹配其中的任意一个data即可;
过滤规则中可以没有指定URI,但是系统会赋予其默认值:content和file,这一点在Intent中需要注意;
为Intent设定data的时候必须要调用setDataAndType()方法,而不能先setData再setType,因为这两个方法是互斥的,都会清除对方的值,这个有兴趣可以参见源码;
在匹配规则中,data的scheme,host,port,path等属性可以写在同一个< />中,也可以分开单独写,其功效是一样的;
总结如下:
1. 一个intent-filter中action、category、data的数量均可超过一个,在进行匹配时,可以理解为这些aciton、category、data会随机组合,只要匹配其中一组即可,换言之,只要intent中的action、category、data均在intent-filter中即可;
2. intent-filter在一个Activity中可以存在多个,进行匹配时,只需要完全匹配(即需要匹配action、category、data)到其中一个即可;
3. action在匹配时必须存在,否则匹配失败,但category可以不存在,不存在时也可以匹配成功,如果category存在,则要求我必须和intent-filter中匹配,其原因在于调用startActivity或startActivity方法会默认为Intent加上android.intent.category.DEFAULT,并且在进行隐式匹配时,必须为intent-filter加上DEFAULT这个category。