题记:这一节感觉比较抽象一点,嘿嘿,先纸上谈会兵,搞清楚下它们到底是个什么,又有什么作用,会用在哪,怎么用的。
主要包括以下三个方面的内容:
- Intent对象
- Intent Filter
- 二者的运作方式
一、Intent对象
感觉Intent对象是一个中介,它能够起到沟通三大核心组件的作用:activity,service,broadcast,实际上是一个抽象的数据结构,用来表示组件之间交互所需要的信息和数据。针对不同的组件,分别有不同的Intent实例对象,这样之间传递消息时,保证只传递到指定的那一类组件去。可以看作是一个信息的集合,包括了目标组件的信息和目标系统的信息。主要包括以下几类:
- Component name:组件名称,用来指定Intent 目标匹配组件。可以是具体的类名,或者是包名(直接指向在manifest中定义该包名的应用)。该属性为可选,不一定非得设置。若不设置,则通过intent filter来匹配目标组件。两种方式的区别:前者是指定目标,用来匹配满足其指定条件的组件;后者就是目标本身的定义,用来被匹配。
- Action:实际上就是一个具有一定格式的字符串,用来表示满足条件的动作或者已经触发的动作(广播)。使用时,直接通过setAction()方法或者getAction()方法来设置或者获取当前的action,一旦调用过setAction(),那么在实际请求过程中,会去intent filter中查找满足action的组件。
- Data:就是Intent中携带的数据,只不过形式是URI或者MIME类型的,根据目标组件的不同而不同。方法包括:setData()和setType(),指向两种不同类型的数据形式。
- Category:也是一个字符串形式的标识,用来标识目标intent必须满足的类型。
- Extras:存放额外数据的,可以放置bundle数据以及一些状态等。
- Flags:标志位,用来标识,具体标识什么,还不明白。
Intent分为两大类:
- Explicit Intents:目标清晰的Intent,通常指定了component name,也即目标。
- Implicit Intents:不清晰的Intent,需要通过Intent Filter来匹配目标。
Intent filter中必须会起作用的三大条件:action,category,data。
二、Intent Filter
按西瓜的理解就是,定义的筛选条件,当有请求过来的时候,按照一定的规则和筛选条件对component进行筛选,查找满足条件的,主要是对implicit intent起作用。匹配规则如下:
- action节点:一个intent filter应该至少有一个action节点,否则的话任何intent过来都无法匹配上。当有多个action节点时,请求的intent只需要满足其中的一条就可以成功匹配上;
- category节点:一个intent filter可以有多个category节点,当intent请求发送过来时,需要intent中的所有category要能在该intent filter下找到对应的category。当该节点不存在时,默认该项匹配通过。
- date节点:匹配指定规则的URI或者MIME类型的数据。data中可以单独定义是匹配URI还是MIME,还是URI的一部分。当然,如果二者同时定义的话,需要同时满足才算成功通过匹配。比较模糊的地方在于:date节点即可以定义请求的intent数据格式,也可以看作成该component返回的数据格式,但是何时用作何种操作,怎么判断呢?
三、二者的运作方式
请求时传递Intent对象,然后由android 系统来解析这个intent对象,根据intent filter查找,满足intent中要求的目标组件是否存在。intent fileter不光能查找到目标组件,还能通过它来过滤出目标组件集合。原来正常应用程序界面上面展示的应用程序图标,都是系统通过"action:android.intent.action.MAIN"和"category:android.intent.category.LAUNCHER"这两个条件来查找到满足条件的application的。
如有错误处敬请指正~~转载请说明出处
看不清未来,那就看脚下。