Android Intent隐式启动的匹配规则

隐式调用需要Intent能够匹配目标组件的IntentFilter(<activity>标签中的<intent-filter>)中所设置的过滤信息

IntentFilter的过滤信息包括action,category,data

只有一个Intent同时匹配 action,category,data才算完全匹配

一个activity可以有多个<intent-filter>标签,intent只有匹配任何一组<intent-filter>标签就可以启动activity

action :

系统预定义了一些action,我们也可以自定义一些action

匹配规则是intent的action和activity的action的字符串完全一样,一个过滤规则可以有多个action,只要任何一个action相同就算匹配成功

注意字符串区分大小写

category:

Intent可以没有category,但是有几个category就必须都匹配上activity中的其中一个

为什么没有category也可以匹配上呢

因为activity必须添加默认category为"android.intent.category.DEFAULT",并且intent没有category启动时会默认加上"android.intent.category.DEFAULT"

data:

data匹配规则和action一样

data的结果由mineType和URI组成

mineType指媒体类型,比如image/jpeg,audio/mpeg4-generic,viede/*等,可以表示图片,文本,视频等不同媒体格式

URI包含的项就比较多了,scheme模式,host主机名,port端口号,path完整路径,pathPattern可以带通配符的完整路径,pathPrefix路径前缀

过滤规则的data带有URI默认值为file和content

intent.setDataAndType(p1,p2),如果先setType再setData会相互覆盖(不知道当前版本是否依旧)

____________________________分割线_____________________________

我们可以在隐式intent启动前判断一下是否存在能匹配到的activity

用PackageManager的resolveActivity方法判断或者intent的resolveActivity(返回最佳匹配activity信息)

扫描二维码关注公众号,回复: 4682772 查看本文章

PackageManager还提供queryIntentActivity方法判断所有能匹配到的activity

 

主activity过滤规则包括

<intent-filter>
    <action android:name="android.intent.action.MAIN" />

    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

猜你喜欢

转载自blog.csdn.net/yh18668197127/article/details/85166219