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结构如下:

://:/[||]

例如:

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信息。

你可能感兴趣的:(Android开发艺术探索笔记)