IntentFilter的匹配规则

启动Activity分为两种,显示调用和隐式调用,这里主要介绍一个隐式调用,隐式调用需要Intent能够匹配目标组件的IntentFilter中所设置的过滤信息,如果匹配不成功,将无法启动目标Activity。IntentFilter中的过滤信息有action、category、data

一个过滤表中的action、category和data可以有多个,所有的action、category、data分别构成不同的类别,同一类别的信息共同约束当前类别的匹配过程。只有一个Intent同时匹配action类别、category类别、data类别才算完全匹配,只有完全匹配才能成功启动目标Activity。另外,一个Activity中可以有多个intent-filter,一个Intent只要能匹配任何一组intent-filter即可成功启动对应的Activity。

1.action的匹配规则

action是一个字符串,系统预定义了一些action,也可以定义自己的action。Intent中的action必须和过滤规则中的action匹配(指action的值完全一样)。一个过滤规则中可以有多个action,那么只要Intent中的action能够和过滤规则中的任何一个action相同即可匹配成功。

2. category的匹配规则

category是一个字符串,category的匹配规则要求Intent中如果有category,那么所有的category都必须和过滤规则中的其中一个category相同。如果Intent中没有category,也能匹配成功,系统会默认加上“android.intent.category.DEFAULT”。

3.data的匹配规则

data的匹配规则和action类似,如果过滤规则中定义了data,那么Intent中必须也要定义可匹配的data。

data语法入下:

<data android:scheme="string"
      android:host="string"
      android:port="stirng"
      android:path="string"
      android:pathPattern="string"
      android:pathPrefix="string"
      android:mimeType="string"   />
data由两部分组成:mimType和URI。mimeType指媒体类型,URI结构如下:
<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]
例如:
content://com.example.project:200/folder/subfolder/etc
http://www.baidu.com:80/search/info
Scheme:URI的模式,比如http、file、content等,如果URI中没有指定scheme,那么整个URI无效。
Host:URI的主机名,比如www.baidu.com,如果host未指定,那么整个URI无效。

Port:URI的端口,仅当URI中指定了scheme和host参数时port参数才意义。

Path、pathPattern和pathPrefix:表述路径信息,path表示完整的路径信息;pathPattern也表示完整的路径信息,但是它可以包含通配符“*”;pathPrefix表示路径的前缀信息。

最后,当我们通过隐式意图启动一个Activity的时候,可以做一下判断,否则可能有错误。判断的方式有两种,采用PackageManager的resolveActivity方法或者Intent的resolveActivity方法,如果他们找不到匹配的Activity就会返回null。另外,PackageManager还提供了queryIntentActivities方法,它返回所用匹配成功的Activity信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值