安卓学习:IntentFilter

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结构

              
date有两部分构成:mimeType和URI。

mimeType:(可以自己定义)结构形式是aaa/bb
指媒体类型 例如: image/jpeg vided/* ...

URI:相当于url 其结构形式:

     ://:/[||]

详细解释:

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);

你可能感兴趣的:(安卓学习:IntentFilter)