Intent与IntentFilter
# 1. IntentFilter
IntentFilter表示“意图过滤器”。用于使用隐式Intent的过滤,对匹配的放行,不匹配的则过滤
通常在AndroidManifest.xml文件中,系统组件的节点下配置:
在一些应用场景中,也可能使用程序代码配置IntentFilter,例如在广播接收者在应用中。
IntentFilter对Intent的以下属性是有效的:
- Action
- Catetory
- Data
# 2. 过滤Action
每个IntentFilter可以添加多个Action,Intent中传入ONE、TWO、THREE任一个均可跳转
每个action节点中name属性的值可以由开发人员自行指定,在同一个Android设备中,action的值应该是不冲突的,因此,该值通常以项目包名作为前缀。
- 每个IntentFilter都应该至少指定一个Action,否则将阻止所有Intent
- 如果Intent对象没有指定Action属性,将不参与匹配校验
- 如果Intent对象指定的Action属性与IntentFilter中任意一个Action匹配,则放行
# 3. 过滤Category
每个IntentFilter可以添加多个Category
与action节点相同,category节点中name属性的值也可以由开发人员指定,且应该是不会发生冲突的
开发人员可以不为Intent对象指定Category,也可以指定多个Category。Android系统必然会为每个Intent对象添加默认的Category,即:android.intent.category.DEFAULT
在过滤规则中,Intent中的每个Category在IntentFilter中都能被找到,则放行,否则将阻止,即,放行的条件为:
- IntentFilter中有默认的Category;
- IntentFilter中的Category,对比Intent中的Category,只能多,不能少。
# 4. 过滤Data
每个IntentFilter可以添加多个Data
android:mimeType
属性中指定MIME类型时,可以使用通配符,例如:text/*、 video/*等。每个URI的完整格式为:
scheme://host:port/path
在IntentFilter中配置Data时,以属性都是可选的,但它们相互并不独立
# URI是否匹配(只匹配指定的字段)
- 如果在IntentFilter中仅指定了
scheme
,则任意相同scheme的Uri均匹配,无视host、port、path部分; - 如果在IntentFilter中指定了
scheme
和host
,则任意相同scheme和host的Uri均匹配,无视port、path部分; - 如果在IntentFilter中指定了
scheme
、host
、port
,则任意相同scheme、host、port的Uri均匹配,无视path部分; - 如果在IntentFilter中指定了完整的
Uri各部分
,则要求被验证的Uri也完全匹配
# Data过滤规则
Data的两个重要属性:Uri 和 MIME,IntentFilter中根据Uri可以推断出MIME
【过滤时】:Intent对象必须和IntentFilter中指定的属性保持一致则放行
- 如果Intent没有指定Uri和MIME,仅当IntentFilter也没有指定Uri和MIME时放行;
- 如果Intent中指定了Uri,但没有指定MIME,且根据Uri无法推断MIME,仅当IntentFilter指定了相同的Uri且没有指定MIME时放行;
- 如果Intent中没有指定Uri,但指定了MIME,仅当IntentFilter也没有指定Uri且指定了相同的MIME时放行;
- 如果Intent中同时指定了Uri和MIME,仅当IntentFilter中也指定了相同的Uri和MIME时放行,或IntentFilter中没有指定MIME,但根据Uri可以推断出MIME时放行
# 小结
IntentFilter可以指定Action、Category、Data来检验是否匹配,匹配的Intent将放行,否则阻止
【放行规则如下】
- Action:Intent对象中的Action(最多一个),在IntentFilter中可被找到
- Category:Intent对象中所有的Category在IntentFilter中都可以找到,且Intent对象中必然有
android.intent.category.DEFAULT
这个Category