Intent和IntentFilter基础知识备忘录

来源:互联网 发布:什么网络分析软件 编辑:程序博客网 时间:2024/06/06 00:06

Intent和IntentFilter匹配的过程,是一种系统行为(机制),可以理解为寻找到那些可以处理某个Intent的Activity、BroadcastReceiver或者Service,把Intent交给它(或它们)处理的过程。而匹配的核心,其实就是这些组件(Activity、BroadcastReceiver、Service)中声明的IntentFilter可以与Intent匹配。


匹配的目标——Intent

Intent的主要属性:包括action和data

Intent的次要属性:包括category、type、component和Extras

显式Intent是通过setComponent或setClass,锁定了目标,明确了要发给谁的一类Intent;其他为隐式Intent。

所以对于显式Intent而言,IntentFilter是没有意义的,存不存在都没关系。


匹配的规则——IntentFilter

1、一个Activity可以有多个intent-filter,只要任意一组intent-filter能匹配某个Intent,它就可以被该Intent启动;


2、IntentFilter中的过滤信息有action、category、data,当且仅当action类别、category类别、data类别同时匹配,才算匹配成功;


3、action是一个字符串,系统预定义了一些action,如“android.intent.action.TIME_SET”等,应用程序开发者也可自定义ation。action的匹配原则是:Intent中的ation必须和IntentFilter中的某一个action匹配(字符串内容完全一致,区分大小写),IntentFilter中的action通常会有多个,而Intent中的action只需匹配其中任意一个即可。注意:当Intent中如果没有指定action,则匹配失败,也就是说要能隐式匹配,Intent必须有一个action(最多也只能有一个action),同理如果IntentFilter中一个action都没有,该IntentFilter也不会与任何Intent匹配;


4、category也是字符串,也有系统预定义和应用开发者自定义两种。Intent中可以没有category,如果有的话,那么IntentFilter中必须包含该Intent所有的category,才有可能匹配成功。当开发者不设置category时,系统会在startActivity或startActivityForResult时,默认为Intent加上“android.intent.category.DEFAULT”这个category,所以为了Activity能够接收隐式启动调用,就必须在其intent-filter中指定“android.intent.category.DEFAULT”这个category。


5、data由两部分组成,mimeType(类型)和URI,URI包含scheme、host、port和path,当URI没有指定时,scheme取默认值content和file,所以这种情形Intent中的URI部分的scheme必须为content或file才能匹配。IntentFilter中声明的data包含Intent中的data,才有可能匹配成功,这点与action的匹配规则类似(但不完全相同,intentFilter可以没有data而被匹配成功)。一个intent-filter里面可以有任意数量的data,一个intent只能携带一个data,intent的data,完全符合intent-filter里面的任意一个data,才有可能匹配成功。进一步说明,若intent-filter声明了data,那么与之匹配的Intent必须定义data;


应用开发过程中,通过隐式Intent启动一个Activity之前,最好通过PackageManager的resolveActivity方法,或者Intent的resolveActivity方法查找是否有匹配的Activity。此外PackageManager的queryIntentActivities(针对service和BroadcastReceiver组件也有类似方法)可以返回所有成功匹配的activity信息。

不过要想确保判断准确,最好传递flag参数:MATCH_DEFAULT_ONLY,因为,如前文所述,没有声明“android.intent.category.DEFAULT”这个category的Activity不能接收隐式Intent,可能导致startActivity失败。




原创粉丝点击