IntentFilter过滤规则
Posted 爱搬砖的摄影师
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IntentFilter过滤规则相关的知识,希望对你有一定的参考价值。
action匹配规则
隐式调用必须指定一个action,只要能匹配上过滤器中多个action的任意一个就行。
category匹配规则
category可有可无,可以指定多个category,多个category中的任意一个都必须能在过滤器中找到。系统在startActivity或者startActivityForResult时会为Intent加上”android.intent.category.DEFAULT”这个category。
data匹配规则
data由两部分组成:mimeType和URI。mimeType指定媒体类型,如image/jpeg、audio/mpeg4-generic。过滤规则中如果没有指定URI,会有默认值content和file,这种情况下,必须为content或者file才能匹配。
如果要为Intent指定完整的data,必须调用setDataAndType方法,不能先setData再setType,这两个方法会彼此清除对方。
最后,如果隐式调用activity,在没有匹配到时会报错。所以可以加个判断:用PackageManager的resolveActivity或者Intent的resolveActivity,如果找不到匹配的activity就会返回null。另外,PackageManager方法还提供了queryIntentActivities,这个方法和resolveActivity的不同在于,它不是返回最佳匹配的Activity,而是返回所有匹配的Activity。
public abstract List<ResolveInfo> queryIntentActivities(Intent intent, int flags);
public abstract ResolveInfo resolveActivity(Intent intent, int flags);
第二个参数使用MATCH_DEFAULT_ONLY这个标记位,表明只匹配那些”android.intent.category.DEFAULT”的。如果不用该标记位,那么就会把那些不含”android.intent.category.DEFAULT”的activity也匹配出来,而因为系统在startActiivty或者startActivityForResult时又会默认加上”android.intent.category.DEFAULT”,这个时候可能就会匹配不到导致失败。
以上是关于IntentFilter过滤规则的主要内容,如果未能解决你的问题,请参考以下文章
Android中IntentFilter匹配规则详解——Android开发艺术探索笔记
阅读《Android 从入门到精通》(34)——Intent Filter