IntentFilter的匹配规则
Activity的隐式调用需要明确指定组件信息。原则一个Intent不应该既是显式又是隐式调用,如果两者共存的话以显式为主。
IntentFilter的过滤信息有action、category、data。一个activity可以有多个intent-filter,一个intent-filter可以有多个action、category、data。只有intent同时匹配这三个过滤信息才能成功启动目标activity。
action:intent中只要跟过滤规则中的任何一个action相同即可匹配成功,如果没有任何一个匹配会报ActivityNotFoundException的错误,直接crash。区分大小写,非中文字符。
category:intent中可以没有category,一旦intent中有category,无论有几个,那么都必须在过滤规则中找到与它一一匹配的category才匹配成功,而action只要找到一个就行。为了activity能够接收隐式调用,必须在它的过滤规则中添加"android.intent.category.DEFAULT"。因为在调用startActivity或startActivityForResult()时为默认加上这个category。
data:有mimeType和URI两部分组成。mimeType指媒体类型,比如image/jpeg等。而URI的结构为<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>],例如content://com.xxx.mm:8080/folder/subfolder/some,http://www.qq.com:8080/path/add. scheme和host必须指定,否则URI无效。匹配规则是需要intent中的data和type与过滤规则中的匹配。给intent指定data和type需要调用intent.setDataAndType,而setData、setType会批次清除对方的值。注意的是,URI的默认值为content和file
通过PackManager的resolveActivity或intent的resolveActivity来判断隐式intent是否有匹配的activity,找不到匹配的会返回null,这样判断能够防止程序奔溃。