1、intentFilter的匹配规则
当对Activity、Service、BroadcastReceiver进行隐式调用时,需要指定IntentFilter,这里记录一下IntentFilter的匹配规则。
IntentFilter中的过滤信息有action、category、data,系统预定义了一些action、category、data,同时我们也可以在应用中自己定义。下面对它们的匹配规则做一个介绍。
1.1、action的匹配规则
action是一个字符串,action给的匹配规则是intent中的action必须能够和过滤规则中的action匹配,这里说的匹配是指action的字符串值完全一样。一个过滤规则中可以有一个或多个action,那么只要intent中的action能够和过滤规则中的任何一个action一样即可匹配成功。如果intent中没有指定action,那么匹配失败。
注:action区分大小写。
1.2、category的匹配规则
category也是一个字符串,它的匹配规则要求,如果intent中含有category,那么所有的category必须可以在IntentFilter中找到一样的的category。与action不同的是,intent中可以没有category。如果intent中没有category,系统自动给intent添加(android.intent.category.DEFAULT)这个category。如果IntentFilter里面没有指定其他的category,那么必须指定(android.intent.category.DEFAULT)这个category才能接收隐式调用。
1.3、data的匹配规则
data的匹配规则跟action类似,如果过滤规则中定义了data,那么intent中必须也要设置至少一个data与intentFilter中的data匹配。
data的语法:
<data android:scheme="string"
android:host="string"
android:port="string"
android:path="string"
android:pathPattern="string"
android:pathPrefix="string"
android:mimeType="string" />
data由mimeType和URI两部分组成。mimeType指媒体类型,比如image/jpeg、audio/mpeg4-generic、video/* 等,可以表示图片、文本、视频等不同的媒体格式,而URI中包含的数据就比较多了,下面是URI的结构:
<scheme>://<host>:<post>/<path>|<pathPrefix>|<pathPattern>
其中,
- scheme,表示URI的模式,一个完整的URI必须包含scheme才能生效。
- host,URI的主机名,一个完整的URI必须包含host才能生效。
- port,URI的端口号
- path、pathPattern、pathPrefix,表示路径信息,其中path表示完整的路劲信息;pathPattern也表示完整的路径信息,区别是在pathPattern中可以包含通配符"*",通配符表示0个或多个任意字符;pathPrefix表示路径的前缀信息。
以下是示例:
content://com.example.projiect:200/folder/subfolder/etc
http://www.baidu.com:80/search/info
值得注意的是,intent的setType方法和setData方法是冲突的,只能设置一个,如果要同时设置,需要使用setDataAndType方法。