Android进阶学习第二天(一)IntentFilter的匹配规则(隐式调用)

Activity的启动模式分为两种,显式调用和隐式调用。显示调用需要明确的指定被启动的对象的组件信息。而隐式调用则不需要明确指定组件信息。原则上一个Intent不应该即使隐式又是显示。如果两者共存,显示优先。隐式调用需要Intent能匹配目标组件的IntentFilter中所设置的过滤信息。IntentFilter中的过滤信息有action、category、data。

 为了匹配过滤列表,需要同时匹配过滤列表中的action、category、data信息。只有一个Intent能同时匹配action、category、data才算完全匹配,只有完全匹配才能启动Activity。另外一个Activity可以有多个Intent-filter,一个Intent只有能匹配其中任意一组即可成功启动对应的Activity。

1,action的匹配规则

action是字符串,系统预定义了一些action,同时我们也能在应用自己定义自己的action。action的匹配规则是Intent中的action必须能和过滤规则中的action的值完全一致。一个过滤规则中可以有多个action,那么只要intent中的action能和过滤规则中的任何一个action相同即可匹配成功。注意action区分大小写。

2,category的匹配规则

category是字符串,系统预定义了一些category,同时我们也能在应用自己定义自己的category。category的匹配规则和action不同,他要求Intent中如果出现了category 必须和过滤规则中的其中一个category 相同。也就是Intent中只有出现了category 不管出现几个必须全都匹配。但是Intent中可以没有category,但是如果没有的话就必须在intent-filter中指定category的值为android:name="android.intent.category.DEFAULT",因为系统在调用startActivity的时候会为Intent默认添加这个。

3,data的匹配规则

data的匹配规则和action类似,如果过滤规则中定义了data,那么Intent中必须也要定义可以匹配的data。data分为两部分 mimeType和URI.mimeType指媒体类型,比如image/jpeg、audio/mpeg4-generic等。可以代表图片、文本等不同格式。URI中包含的数据比较多。

URl的结构

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

例如

http://www.baidu.com:8080/search/info

Scheme:URI的模式,比如content、file、http。

Host:URI的主机名,如www.baidu.com

Port:URI中的端口号,比如8080

剩下三表述路径信息,path表示完整路径。pathPattern也是表示完整路径但是中间能有通配符 * ,pathprefix代表路径前缀信息。

另外注意如果为Intent指定完整的data,必须要用setDataAndType方法,不能先调用setData,再调用setType,因为这两个方法会互相清除对方的值。

 

最后,当我们通过隐式的方式去启动一个Activity的时候,会有可能找不到匹配的Activity,这样就会报错。为了避免这种情况,我们可以先判断一下,看是否有Activity能匹配我们的Intent。判断的方法有两种:采用PackageManager的resolveActivity方法或者Intent的resolveActivity方法,如果他们匹配不到Activity就会返回null。这个方法的两个参数,第一个是Intent也就我们要验证的Intent,第二个参数需要注意,我们要使用MATCH_DEFAULT_ONLY这个标记的含义是仅仅匹配那些在intent-filter中声明了android:name="android.intent.category.DEFAULT"这个category的Activity。

还有一类action和category比较重要。

    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />

这两者的共同作用是用来声明这是一个入口Activity,会出现在应用列表中(如默认的MainActivity),两个单独使用无意义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值