android IntentFilter 匹配规则 (适用于面试的问题解答)
1)android IntentFilter的匹配规则
启动activity分为两种,显示调用和隐式调用,
显示调用需要明确的指定被启动对象的组件信息,包括包名和类名,
隐式调用则不需要明确指定组件信息,原则上一个Intent不应该即是显示又是隐式,
如果二者共存的话以显示调用为主,
隐式调用需要Intent能够匹配目标组件的IntentFilter中所设置的过滤信息,如果
不匹配则无法启动目标Activity,
intentFilter的过滤信息有action category data
eg:
这里我用友盟分享sdk中,在MainFest.xml中集成的一个activity为例:
(1)action的匹配规则:
action是一个字符串,action的匹配规则是Intent中的action必须能够和过滤规则中action
匹配,一个过滤规则中可以有多个action,只要intent中的action和过滤规则中任何一个匹配上,
就是匹配成功,(区分大小写)
(2)category的匹配规则:
category是一个字符串,category必须和过滤规则中的其中一个category相同,
intent中可以没有category,但是一点有就必须能个和过滤规则中的某个action相同,
如果没有系统会在调用startActivity或者startActivityforResult的时候默认为Intent加上android.
intent,category.DEFAULT
为了我们能够接收隐式调用,必须在IntentFilter中指定这个category,
(3)data的匹配规则
data由两部分组成,mimeType和URI,
mimeType指媒体类型。可以表示图片,文本等;
URI的结构:
scheme://host:port/path/pathprefix
Scheme: 表示URI的模式,(http file content)如果uri没有指定scheme,表示整个uri无效
host:URI的主机名 (www.baidu,com)如果host没有指定,整个uri无效
port:uri中的端口号。(80 8080 8088.。。)仅当uri中指定scheme和host参数时port才有意义
path pathPattern: 这两个参数表示路径信息,path表示完整路径信息,
如果要为Intent指定完整的data。必须要调用setDataAndType, 不能setData和setType,
这两个方法彼此清除对方的值;