IntentFilter的匹配规则

来源:互联网 发布:javascript转义字符表 编辑:程序博客网 时间:2024/04/28 05:42

隐式调用Activity时需要Intent能够匹配目标Activity的IntentFilter中所设置的过滤信息,如果不匹配,将不能启动Activity。
一个Activity中可以有多个intent-filter,一个intent-filter中也可以有多个action、category和data。一个Intent只要匹配任意一组
intent-filter(即同时匹配这组intent-filter中的action类别、category类别和data类别)就能成功启动目标Activity。
另外:intent-filter的匹配规则对于Service和BroadcastReceiver也是同样的道理。但系统对于Service的建议是尽量用显示调用。

action

action是一个字符串,系统预定义了一些action,我们也可以定义自己的action。
它区分大小写,匹配时必须完全一样。

  • 匹配要求:Intent中必须存在action且必须和过滤规则中的一个action相同

category

category是一个字符串,系统预定义了一些category,我们也可以定义自己的category。

  • 匹配要求:Intent中可以没有category,但一旦有category,不管有几个,每个都要和过滤规则中的一个category相同。

注意:系统在调用startActivity或startActivityForResult时会默认为Intent加上”android.intent.category.DEFAULT”这个category。所以为了Activity能够接收隐式调用,必须在intent-filter中指定”android.intent.category.DEFAULT”这个category。

data

  • 匹配规则:和actoin类似,如果过滤规则中定义了data,那么Intent中至少要能够匹配一个data。

  • 组成:mimeType + URI

  • mimeTyp:媒体类型,比如image/jpeg、audio/mpeg4-generic、video/*等,可以表示图片、文本、视频等不同的媒体格式。
  • URI,默认值:content和file。结构如下:
    <scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]
    如:http://www.baidu.com:8080/search/info
    Scheme:URI的模式,比如http、file、content等,如果没有指定,则整个URI无效。
    Host:主机名,如果未指定,则整个URI无效。
    Port:端口号
    Path、pathPrefix、pathPattern:路径信息
  • 指定data
    如果要为Intent指定完整的data,必须要调用setDataAndType方法,不能先调用setData再调用setType,因为这两个方法会彼此消除对方的值。

    调用时判断

    隐式调用时最好判断一下,否则没有目标Activity,就会报错。
    可以用PackageManager的resolveActivity方法或者Intent的resolveActivity方法。
    PackageManager还提供了一个queryIntentActivities方法。
    resolveActivity和queryIntentActivities都有一个参数flags,我们要使用MATCH_DEFAULT_ONLY这个标记位,表示匹配过滤规则中声明了默认category的Activity,这样才能保证Activity一定能调用成功。

0 0
原创粉丝点击