一、Intent类
1、Intent Name部分
对于Intent对象来说,组件名称不是必须的,如果添加了组件名称则该Intent为“显示Intent”,这样Intent在传递对象的时候会直接根据Component Name对象的信息去寻找目标组件。如果不设置组件名称,则为“隐式Intent”,Android会根据Intent中的其他信息来确定响应该Intent的组件是哪个。
2、Action部分
Action为一个字符串对象,其描述了该Intent会触发的动作。Android系统中已经预先定义了一些表征Action的常量,同时,开发人员也可以自己定义Intent的动作描述。
3、Data部分
Data描述Intent的动作所操作的数据的URI及类型,不同的Action对应不同的操作数据。当为组件进行Intent的匹配检查时,正确设置Data的URI资源和数据类型很重要。
4、Category部分
Category为字符串对象,其包含了可以处理Intent的组件的类别信息,Intent中可以包含任意个Category。同Action一样,Android系统中预先定义了一些Category常量,但是不可以自行定义Category。
5、Extra部分
Extra是一组键值对,其包含需要传递给目标组件并由其处理的一些额外信息。
6、Flags部分
一些有关系统如何启动组件的标志位,所以的标志位都已经在Android系统中预先定义。
二、IntentFilter类简介
当Intent在组件之间进行传递时,组件如果需要告诉Android系统自己能够响应和处理哪些Intent,就需要使用IntentFilter对象。顾名思义,IntentFilter对象负责过滤组件无法响应和处理的Intent,只将自己关心的Intent接收进来进行处理。
Intent实行“白名单”管理,即只列出组件乐于接受的Intent,IntentFilter只会过滤隐式Intent,显式的Intent会被直接传递到目标组件,一个隐式的Intent只有通过了组件的某一个IntentFilter的过滤,才可以被组件接收并处理。
诸如Activity,Service,Broadcast Receiver这些组件可以有一个或多个IntentFilter,每个IntentFilter相互独立,只需要通过一个即可。
IntentFilter中具有与Intent对应的用于过滤Action、Data和Category的字段,一个Intent对象要想被一个组件处理,必须通过这3个环节的检查。
1、检查Action
尽管一个Intent只可以设置一种Action,一个IntentFilter却可以持有一个或者多个Action用于过滤,到达的Intent对象只需要匹配其中一个Action即可。但是IntentFilter的Action部分不可以为空,如果为空则会阻塞掉所有的Intent。相反,如果Intent的Action字段未设置,其将通过所有的IntentFilter的Action
2、检查Data
同Action一样,IntentFilter中的Data部分也是可以为一个或多个,而且可以没有。每个Data包含的内容为URI和数据类型,进行Data检查时主要也是对这两点进行比较。
3、检查Category
IntentFilter中可以设置多个Category,检查Category时,只有当Intent对象中所有的Category都匹配Intent中的Category时该对象才可以通过检查,并且当Intetn对象中所有的Category可以比Intent中的Category多,但是必须都包含Intent对象中所有的Category。如果一个Intent中没有设置Category,则其将通过所有IntentFilter的Category检查。