1. 显示调用与隐式调用
显示调用需要明确指定被启动对象的组件信息,包括类名与包名,隐式调用不需要明确指定组件信息。如果两者共存以显示调用为主。
隐式调用需要 Intent 能够匹配目标组件的 IntentFilter 中过滤信息。过滤信息有 action,category,data
。过滤信息可以有多个,只有一个 Intent 同时匹配 action,category,data 匹配成功才能启动目标 Activity 。
注意:一个 Activity 可以有多个 intent-filter ,Intent 匹配任意一组 intent-filter 可以成功启动 Activity。
2. action 的匹配规则
系统预定义了一些 action。一个过滤规则中可以有多个 action ,只要 Intent 中 action 能和过滤规则中任何一个 action 相同即可匹配成功。
总结:与category匹配规则不同,action 的匹配要求 Intent 中的 action 存在且必须和过滤规则中的其中一个 action 相同,action 区分大小写。
3. category 的匹配规则
系统预定义了一些 category ,它要求 Intent 中如果含有 category ,那么所有 category 都必须和过滤规则中的其中一个 category 相同。
注意:不设置 category 也能匹配,因为系统在调用 startActivity 或者 startActivityForResult 的时候会默认为 Intent 加上 "andorid.intent.category.DEFAULT"
, 为了能 Activity 能接收隐式调用,必须指定以上 category 。
4. data 的匹配规则
data 语法结构:由两部分组成 mimeType 和 URI。
mimeType:指的媒体类型,比如 image/jpeg,video/* 等。
URI:<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]
content://com.example.mg:100/fold/subfolder/etc
http://www.axe.com:500/profile/info
<data android:scheme="string"
android:host="string"
android:port="string"
android:path="string"
android:pathPattern="string"
android:pathPrefix="string"
android:mimeType="string"/>
Scheme:URI的模式。如果URI中没有指定Scheme.那么整个URI无效。默认值为content 和 file。
Host:URI的host。比如www.axe.com。如果指定了scheme和port,path等其他参数,但是host未指定,那么整个URI无效;如果只指定了scheme,没有指定host和其他参数,URI是有效的。可以这样理解:一个完整的URI :http://www.axe.com:500/profile/info 我将后面的prot 和path“:500/profile/info ”去掉,这个URI任然有效。如果我单独将www.axe.com 那这个URI就无效了。
Port:URI端口,当URI指定了scheme 和 host 参数时port参数才有意义。
path:用来匹配完整的路径,如:http://example.com/blog/abc.html,这里将 path 设置为 /blog/abc.html 才能够进行匹配;
pathPrefix: 用来匹配路径的开头部分,拿上面的 Uri 来说,这里将 pathPrefix 设置为 /blog 就能进行匹配了;
pathPattern: 用表达式来匹配整个路径。
网友评论