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过滤规则)