IntentFilter是什么
顾名思义IntentFilter:“意图过滤器”,主要用来过滤隐式意图。
当用户做一些操作的时候,安卓系统会根据配置的“意图过滤器”,去寻找可以响应操作的组件来进行服务 。
为什么用IntentFilter
Activity有两种启动模式(此处不多说),一种是显示跳转,一种是隐式跳转。其中隐式跳转就是通过匹配设置的IntentFilter进行实现的。
怎么用IntentFilter(IntentFilter的匹配原则)
IntentFilter的过滤信息包含action 、category、data。只有同时匹配过滤列表中的action、category、data,才能成功,其中一个Activity可以有多个IntentFilter,一个Intent只要能匹配任何一组IntentFilter,就可以成功启动对应的Activity
下面来想写讲解IntentFilter的匹配规则
1.action 的匹配规则
action其实就是一个字符串,其中系统定义了一些action,我们也可以自己定义自己的action。
action的匹配规则是:Intent中的action是必须存(可以有多个action)在并且必须要和过滤规则中的其中一个action完全形同(包括大小写)
2.category 的匹配规则
category也是一个字符串,系统也定义了一些category,我们自己也可以定义自己的category。
category和action的匹配原则不同,Intent中不一定含有category,如果含有category,那么所有的category必须要和过滤规则中的其中一个category相同。
为什么不设置category也可以匹配?
原因是系统在startActivity或者startActivityForResult的时候默认为Intent
加上一个android.intent.category.DEAFAULT,所以必须在intent-filter中
加上android.intent.category.DEFAULT这个category
3.data的匹配规则
data的匹配规则和action是一样的,只是data的结构比较复杂
先来看一下整体的data结构
<data
android:host="www.baidu.com"
android:mimeType="text/abc"
android:path="/my"
android:port="8080"
android:scheme="http"></data>
date有两部分构成:mimeType和URI。
mimeType:(可以自己定义)结构形式是aaa/bb
指媒体类型 例如: image/jpeg vided/* ...
URI:相当于url 其结构形式:
<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]
详细解释:
Scheme:即URI的模式。如果URI中没有指定Scheme.那么整个URI无效。默认值为content 和 file。
Host:URI的host。比如www.baidu.com。如果指定了scheme和port,path等其他参数,但是host未指定,那么整个URI无效;如果只指定了scheme,没有指定host和其他参数,URI也是无效的。可以这样理解:一个完整的URI :http://www.axe.com:500/profile/info 我将后面的port 和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: 用表达式来匹配整个路径。
如果想匹配上述一开始提到的例子可以这么写:
Intent intent = new Intent();
intent.setAction("aaa");
intent.setDataAndType(Uri.parse("http://www.baidu.com:8080/my"),"text/abc");
startActivity(intent);