IntentFilter可用于Activity、Service、Receiver中。
IntentFilter中过滤信息由action、category、data其中一个或多个组成,他们的匹配规则各不相同。
action匹配规则
一个Intent只能有一个action并且隐式调用的时候必须有一个action,而一个IntentFilter可以有多个action,匹配的时候只要Intent的action和Intent中的其中一个action完全匹配则匹配成功。
action的匹配是区分大小写的。
category匹配规则
category和action不同,Intent可以没有category或拥有多个category,IntentFilter里也可由有多个category,匹配的时候如果Intent里存在category,那么这些category必须都 各自和IntentFilter里面的一个category相同,否则匹配不成功。
需要注意的时,尽管我们Intent里可以不设置category,但是当我们调用startActivity或startActivityForResult方法的时候会默认给我们传进去的Intent添加上"android.intent.category.DEFAULT"这个category,所以这时候Intent是默认有一条category的,因此如果我们要隐式调用Activity则必须要在这个Activity的IntentFilter添加上"android.intent.category.DEFAULT"这个category,否则无法匹配。
data匹配规则
data的结构如下
<data android:scheme="string"
android:host="string"
android:port="string"
android:path="string"
android:pathPattern="string"
android:pathPrefix="string"
android:mimeType="string"/>
data由URI和mintType两部分组成,mimeType指媒体类型,比如image/jpeg、video/*等等
当IntentFilter里拥有data时,那么匹配的Intent必须拥有data,并且能完全匹配IntentFilter中的某一个data。
当IntentFilter没有设置URI的时候,该IntentFilter的scheme拥有默认值为content和file。
Intent只能拥有一个data,并且调用setData或setType方法时,这两个方法会彼此清除对方的值,要设置同时设置这两个值需要调用setDataAndType方法。
其他
现在Android版本不支持Service的直接隐式调用,我们需要先通过queryIntentServices方法获取匹配该Intent的Service的相关信息后采用显式调用。