IntentFilter匹配规则-交朋友

作用

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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值