概述
在AndroidMinifast中注册一个Activity、Service、Broadcast时,可以给组件加
一个完整的IntentFilter的形式如下1
2
3
4
5
6
7
8
9<intent-filter>
<action android:name="String形式">
<action android:name="String形式">
<category android:name="String形式">
<category android:name="String形式">
<data android:mimeType="String形式:image/*">
<data android:scheme="http/file/content形式">
<data android:host="www.baidu.com">
</ intent-filter>
接下来对action,category和data分别进行介绍
action
IntentFilter中的action规则为String类型,可以同时存在多个,匹配成功的条件为:Intent中的action必须存在且与匹配规则里其中一个action匹配。
例如(忽略category和data):
Intent:1
Intent intent = new Intent("com.zhouk.demo");//action必须存在
IntentFilter:1
2
3
4
5<intent-filter>
<action android:name="com.zhouk.demo">
<action android:name="com.zhouk.demo1">
... ...
</ intent-filter>
category
category为String类型,IntentFilter中的category可以有多个,Intent中的category也可以有多个。匹配成功的条件是:Intent中的所有category都必须与IntentFilter的category中的一个匹配到才算是成功
例如(忽略action和data):
Intent:1
2
3Intent intent = new Intent();
intent.addCategory("com.zhouk.demo1");
intent.addCategory("com.zhouk.demo2");//可以添加多个category,必须全部匹配到
IntentFilter:1
2
3
4
5
6
7<intent-filter>
... ...
<category android:name="com.zhouk.demo1">
<category android:name="com.zhouk.demo2">
<category android:name="com.zhouk.demo3">
... ...
</ intent-filter>
data
相较于前面的category和action,data会稍稍复杂一些。
IntentFilter中的data会包括两个部分:mimeType和URI。
mimeType会指定类型。例如图片格式:image/png,imge/。加代表支持所有图片格式。当然也可以有其他媒体:video/*
URI的结构是:
在代码中可以表现为:
Intent:1
2Intent intent = new Intent();
intent.setDataAndType(URi.paise("flie://aaa"),"image/png");//前面是URI,后面是mimeType
IntentFilter:1
2
3
4<intent-filter>
<data android:mimeType="image/*">
<data android:scheme="file" ...>
</ intent-filter>
IntentFilter验证
只有当action,category和data全部都匹配到了才可以称之为匹配成功,可以开启Activity或者Service和广播。一旦匹配不成功变会报异常。那么如何避免Intent因匹配失败而导致的异常呢?
在使用隐式方式开开启组件时,可以利用PackgeManager的resolveActivity方法来验证Intent,如果不返回null极为匹配成功。