什么是IntentFilter
在Android开发中,有显示和隐式两种启动Activity。其中显示非常简单,而隐式调用就涉及到了IntentFilter,这是Intent的一种匹配规则,想隐式的调用特定的Activity,就必须要让Intent匹配想要启动的Activity的IntentFilter。
IntentFilter说明
- IntentFilter中有action、category、data三个类别,每个类别都可以有多个;
- 一个Activity可以有多个IntentFilter,Intent只需要成功匹配一个IntentFilter即可启动对应的Activity;
- Intent需要同时匹配IntentFilter中的action、category、data三个类别,才算完全匹配;
- Inten中的action字符串和IntentFilter中的action字符串完成相同即算匹配(大小写敏感);
action匹配规则
- 一个Intent中只会存在一个action,只要action匹配中IntentFilter中的任意一个action即算匹配成功;
- 需要注意的是,如果Intent中没有action,则匹配失败;
- Inten中的category字符串和IntentFilter中的category字符串完成相同即算匹配(大小写敏感);
category匹配规则
- Intent的启动对象是Activity时,系统会默认给Intent添加一个值为"android.intent.category.DEFAULT"的category
- Intent中可以有多个category;
- 不管Intent中有多少个category,每一个category都需要能够在IntentFilter中找到能够匹配的值才算完全匹配;
data的匹配规则
- data由mimeType和URI组成,mimeType指媒体类型;
- 一个Intent中只会存在一个data,只要data匹配中IntentFilter中的任意一个data即算匹配成功;
- 需要调用setDataAndType才能同时设置data和type两个值,单独设置其中一个值会覆盖另一个值;
注意事项
- 隐式调用Activity时,最好先调用Intent的resolveActivity或者PackageManager的resolveActivity或queryIntentActivities方法来验证是否有匹配的Activity,否则会抛出异常
- 另外,IntentFilter的匹配规则对于Service和BroadcastReceiver同样适用;