作用
IntentFilter匹配规则用于Activity隐式调用,IntentFilter要考虑的匹配信息有:action、category、data。
匹配规则
从action、category、data来说
只有一个Intent同时匹配action、category和data才算完全匹配,只有完全匹配才能成功启动目标Activity。
朋友之间要意气相投,满足action、category、data这三个方面我们就是朋友了。
从Intent与intent-filter的匹配来说
一个Activity中可能有多个intent-filter,一个Intent只要能匹配任何一个intent-filter即可成功启动对应的Activity。
假如有这样一个人,早上、中午和晚上性格就表现出三个不同面,只要有一面相投,我们就是朋友了。
action匹配规则
Intent中的action存在且必须和过滤规则中的其中一个action相同。
category的匹配规则
Intent中如果含有category,那么所有的category都必须和过滤规则中的其中一个category相同。
data的匹配规则
data的匹配规则与action一样。
Intent中的data存在且必须和过滤规则中的其中一个data完全匹配。这里的完全匹配是指过滤规则中出现的data部分也出现在了Intent中的data中。
data有两部分组成,mimeType和URI。mimeType指媒体类型,比如:image/jpeg、audio/mpeg4-generic和video/*等,可以表示图片、文本、视频等不同的媒体格式。
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等。不指定scheme那么整个URI无效。
host:URI的主机名,比如:www.baidu.com,如果不指定host那么整个URI无效。
port:URI中的端口号,比如80,只有URI中指定了scheme和host参数的时候port才有效。
path:表示完整的路径信息。
pathPattern:也表示完整的路径信息,但它里面可以包含通配符*
,*
表示0个或者多个任意字符,由于正则表达式规范,*
要写成\\*
,\
要写成\\\\
。
pathPrefix表示路径的前缀信息。
如:
<intent-filter>
<data android:mimeType="image/*"/>
</intent-filter>
这种规则制定了媒体类型为所有类型的图片,Intent中的mimeType必须为image/*
才能匹配
这里没有指定URI,但它有默认值为content和file,因此Intent中的URI部分的schema必须为content或者file才能匹配
因此相匹配的Intent可以为:
intent.setDataAndType(Uri.parse("file:/abc"),"image/png")
。
如果要指定完整的data,必须使用setDataAndType方法,如果先调用setData再调用setType,会彼此清除,看源码很容易理解:
public Intent setData(Uri data){
mData = data;
mType = null;
return this;
}
实例:
<intent-filter>
<data android:mimeType = "video/mpeg" android:scheme="http" .../>
<data android:mimeType = "audio/mpeg" android:scheme="http" .../>
</intent-filter>
Intent中的data匹配可以写成:
intent.setDataAndType(Uri.parse("http://abc"),"video/mpeg");
或者:
intent.setDataAndType(Uri.parse("http://abc"),"audio/mpeg");
intent-filter的data有两种写法:
<intent-filter ...>
<data android:scheme="file" android:host = "www.baidu.com" />
...
</intent-filter>
<intent-filter ...>
<data android:scheme="file" />
<data android:host = "www.baidu.com" >
...
</intent-filter>