IntentFilter的匹配规则
IntentFilter中的过滤信息有action,category,data。只有同时匹配过滤表中的action、category、data信息,才算匹配成功。
一个过滤列表中的action、category和data可以有多个,所有的action、category、data分别构成不同的类别,同一类别的信息共同约束当前类别的匹配过程。只有一个Intent同时匹配action、category、data才算完全匹配,只有完全匹配才能成功启动目标
Activity。一个Activity可以有多个intent-filter,一个Intent只需要匹配其中一组intent-filter就可以成功启动对应的Activity。
Android 原生设置(Settings)的AndroidManifest.xml文件中有如下代码:
<activity android:name="Settings$ApnEditorActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<action android:name="android.intent.action.EDIT"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="vnd.android.cursor.item/telephony-carrier"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.INSERT"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="vnd.android.cursor.dir/telephony-carrier"/>
</intent-filter>
<meta-data
android:name="con.android.settings.FRAGMENT_CLASS"
android:value="com.android.settings.ApnEditor"/>
</activity>
启动此Apn编辑界面,需要匹配其中任意一组intent-filter即可。
1.action的匹配规则
action是一个字符串,它的匹配规则是Intent中的action必须能够和过滤规则中的action匹配(字符串值完全相同)。一个过滤规则中可以有多个action,那么只要Intent中的action能够和过滤规则中的任何一个action相同即可匹配成功。
2.category的匹配规则
category是一个字符串,它的匹配规则是Intent中如果包含category,那么所有的category都必须和过滤规则中的其中一个category相同,即Intent中包含的category(可以为空,不包含category)是过滤规则category的子集。系统在调用startActivity或者startActivityForResult的时候会默认为Intent加上“android.intent.category.DEFAULT”这个category,同时,为了Activity能够接收隐式调用,就必须在intent-filter中指定“android.intent.category.DEFAULT”这个category。
3.data的匹配规则
data的匹配规则和action类似,要求Intent中必须含有data数据,并且data数据能够完全匹配过滤规则中的某一个data。这里的完全匹配是指过滤规则中出现的data部分,也出现在了Intent中的data中。
data的语法如下:
<data android:scheme="string"
android:host="string"
android:port="string"
android:path="string"
android:pathPattern="string"
android:athPrefix="string"
android:mimeType="string" />
data由两部分组成,mimeType和URI。mimeType指媒体类型,比如image/jpeg、video/*等。URI包含的数据比较多,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等。
host URI的主机名,例如www.google.com等。
port URI的端口号,例如80,只有当URI中指定了scheme和host参数的时候,port参数才有意义等。
path、pathPattern和pathPrefix 这三个参数表示路径信息,path表示完整的路径信息;pathPattern也表示完整的路径信息,但是可以包含通配符“*”,由于正则表达式的规范,如果想表示真是的字符串,需要将“*”写成“\\*”,"\",要写成“\\\\”,pathPrefix表示路径的前缀信息。
如果要为Intent指定完整的data,必须要调用setDataAndType方法。
有一类action和category比较重要,这两个共同作用来表示这是一个入口Activity,并且会出现在系统的应用列表中。
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"
在通过隐式方法启动一个Activity的时候,需要增加判断,可以使用PackageManager的resolveActivity方法或者Intent的resolveActivity方法,如果找不到对应的Activity就会返回null,避免启动的Activity不存在引起程序崩溃。
网友评论