intent-filter匹配规则,是时候了解一波了

intent作为连接Android中四大组件的桥梁,在隐式intent中时通常需要进行匹配,这就要求我们对intent-filter的匹配规则有一定了解,intent-filter通常包括三部分,aciton、category、data

<activity android:name="dbh.leo.com.intentfilter.MyActivity">
    <intent-filter>
        <action android:name="com.leo.a"/>
        <action android:name="com.leo.b"/>

        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="com.leo.c"/>
        <category android:name="com.leo.d"/>

        <data android:mimeType="text/plain"/>
    </intent-filter>
</activity>

下面针对这三个部分分别进行介绍:

1.action的匹配规则
我们知道action是一个字符串,系统默认帮我们定义了一些action,同时我们也可以自定义。字符串中的字母是严格区分大小写的,这个在匹配的时候是要注意的。关于action的匹配很简单,我们可以直接总结归纳一下:
Intent中必须存在action,这一点和category不同;
action的字符串严格区分大小写,intent中的action必须和过滤规则中的action完全一致才能匹配成功;
匹配规则中可以同时有多个action,但是Intent中的action只需与其中之一相同即可匹配成功;

2.category的匹配规则
和action一样,category也是一个字符串,系统同样默认定义了一些,我们一样可以自定义。其实category的匹配规则和action有很强的可比性,所以我们可以完全类比action来进行总结
匹配规则中必须添加“android.intent.category.DEFAULT”这个过滤条件(原因后面会介绍)
Intent中可以不设置category,这个时候你必须是使用startActivity或者startActivityForResult的时候(原因也在后面)
Intent中可以同时设置多个category,一旦设置多个catrgory,那么每个category都必须能够和过滤条件中的某个category匹配成功.(相比之下,action只需要有一个匹配成功即可)

3.data的匹配规则
在介绍data的匹配之前,我觉得还是有必要再温故一下data的结构吧

<data android:scheme="string"
      android:host="string"
      android:port="80"
      android:path="/string"
      android:pathPattern="string"
      android:pathPrefix="/string"
      android:mimeType="text/plain"/>

总的来说data包含两部分:mimeType和URI。

mimeType表示image/ipeg,video/*等媒体类型
URI信息量相对大一点,其结构一般为:

<scheme>://<host>:<port>/[<path>|<pathPrefix|<pathPattern>>]

下边讲分别来介绍下各个节点数据的含义

scheme:整个URI的模式,如常见的http,file等,注意如果URI中没有指定的scheme,那么整个uri无效
host:URI的域名,比如我们常见的www.mi.com,www.baidu.com,与scheme一样,一旦没有host那么整个URI也毫无意义;
port:端口号,比如80,很容易理解,只有在URI中指定了scheme和host之后端口号才是有意义的;
path,pathPattern,pathPrefix包含路径信息,path表示完整的路径,pathPattern在此基础上可以包含通配符,pathPrefix表示路径的前缀信息;

其实data的匹配规则和action也有点类似:
Intent中必须有data数据;
Intent中的data必须和过滤规则中的某一个data完全匹配;
过滤规则中可以有多个data存在,但是Intent中的data只需匹配其中的任意一个data即可;
过滤规则中可以没有指定URI,但是系统会赋予其默认值:content和file,这一点在Intent中需要注意;
为Intent设定data的时候必须要调用setDataAndType()方法,而不能先setData再setType,因为这两个方法是互斥的,都会清除对方的值,这个有兴趣可以参见源码;
在匹配规则中,data的scheme,host,port,path等属性可以写在同一个< />中,也可以分开单独写,其功效是一样的;

总结如下:
1. 一个intent-filter中action、category、data的数量均可超过一个,在进行匹配时,可以理解为这些aciton、category、data会随机组合,只要匹配其中一组即可,换言之,只要intent中的action、category、data均在intent-filter中即可;

2. intent-filter在一个Activity中可以存在多个,进行匹配时,只需要完全匹配(即需要匹配action、category、data)到其中一个即可;

3. action在匹配时必须存在,否则匹配失败,但category可以不存在,不存在时也可以匹配成功,如果category存在,则要求我必须和intent-filter中匹配,其原因在于调用startActivity或startActivity方法会默认为Intent加上android.intent.category.DEFAULT,并且在进行隐式匹配时,必须为intent-filter加上DEFAULT这个category。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值