Intent机制
组件的连接模式
组成
连接模型由三部分组成 调用组件、 组件管理服务、 实现组件
流程
1. 调用组件 描述其功能需要的Intent对象,发给 组建管理服务 。
2. 组件管理服务负责将 Intent对象 与描述组件功能的 IntentFilter 对象进行比较,寻找合适的实现组件。
3. 组件管理服务 启动Intent描述的 实现组件 ,并将intent传送给他
说明
组件管理服务:是一个系统服务,运行在系统核心进程的独立线程中,通过进程间通信机制,与各个组件交互。
Intent对象的作用
- 载体:是组件间通信信息的载体,封装了调用组件提供的指令、数据,序列化传递给实现组件。
- 协议:定义了组件间的连接协议。每个intent包含若干数据项。
- 调用组件 根据规范构造Intent对象,描述其需要。 实现组件 根据规范解析Intent对象, 组件管理服务 依照这规范寻求匹配的组件
Intent的构成
Intent使用 7 个部分构成的: Action 、 Data、 Type、 Component 、 Extras 、 Flag
Action
定义
表示动作。
说明
当 调用组件 指明一个 action , 执行组件 会依照此动作,接受相关输入,执行操作,生成输出。
当系统预设的标准动作无法满足需要,可自定义 action。
Data
定义
当请求时,**调用组件** 如有明确的数据对象,就会用 Data 存储。
说明
譬如:
邮件应用需要第三方组件展示附近中的图片信息,则在请求查看图片的Intent中的 Data 存放图片地址信息。
Type
定义
如果 data 用于特指,那么 Type 则用于泛指。
说明
Type 是MIME格式的String,用于描述组件的能够处理的请求类型或不错说明 data 类型,其可以通过 * 表示整个类别的信息,譬如 iamge/*
注意
1. Data 和 Type 经常互斥使用。当调用 setType 时,之前设定的 Data 会清空,反之一样。
2. 需要 Data 表示数据还是 Type 表示类型,经常是更加 action 。
3. 但是很多时候, Type 与 Data 又是相辅相成: Data 作为数据的载体, Type 作为 Data 的补充.
Catagory
定义
表示intent是有条件,必须满足条件才能运行
说明
每个intent可包含多个 Category ,彼此之间是 与 关系,一个组件需支持全部 Category 项才行
如果一个组件需要启动其他应用,且希望进入的是这个应用的入口组件,应添加 Intent.Category_LAUNCHER
。
Component
定义
目标组件的类型信息
说明
当调用组件明确指定了Component信息,组件管理服务就不再需要跟进 Action、 Data 等信息寻找。
一旦指定了 Component ,Intent对象就变成单纯的信息载体,只负责传递信息和数据。
Extras
定义
数据传输的载体,负责将数据从调用组件传递到实现组件。
说明
1. Extras 是 Bundle 对象,按 键/值 对存储,其实现了 Parcelable 接口,可序列化和反序列化。
2. Extras 的使用关健在于键值的定义! 调用组件 和 实现组件 都需事先知晓每个键值的数据类型和含义。键值的定义与 组建管理服务 无关,可任意String。
Flag
定义
一个整数,由一些列标准位汇集而成,是 调用组件 指定 组件管理服务 构建 实现组件 的方式,常用于改变实现组件的 任务模型 和 进程模型 。
说明
Intent对象定义了所有的*Flag*
被设定的 Flag 标志位将会重复生效,是 与 关系。
Intent对象的解析
在意图机制中, 组件管理服务 负责接受与分析。从 实现组件的选择上,Intent对象分为两类: Explicit Intent 和 Implicit Intent
Explicit Intent
精确描述 :指所用带 Component 的Intent,常用于内部通信,不带动态机制
Implicit Intent
模糊描述:不包括 Component 的Intent,不在乎 实现组件 是谁,应用于不同应用组件间联通,完全解耦。
IntentFilter对象
说明
1.*intentFiler*是各个组件用于描述其功能的,通过组件的 intentFilter 信息, 组件管理服务 可以了解各个组件的功能。当 组件管理服务 接收到 调用组件 发来的模糊Intent,会与所有组件的 IntentFilter进行匹配,寻找实现组件。
2.每个组件可以有 任意数目 的 intentFilter。组件包含的 intentFilter越多,其接受范围越广。
3.不含 intentFilter 的组件,只能通过精确调用
其他
IntentFilter 信息在配置文件 <intent-Filter>
中添加
Action标签
每个 intentFilter 都必须包含 action。可以包含多个 action,表示同时支持多个动作。( 或 )。
对于大部分 intentFilter 对象,都会包含一个 action 。如果一个组件期望支持多个 action,建议添加多个 intentFilter
category标签
intentFilter 可以包含多个 categor ,表示该对象能够接受多个 category。他们是“ 或 ”关系,表示该intentFilter 无论满足哪一个条件都可以接受请求。
Data和Type标签
IntentFilter也可以包含可接受数据的范围 和 类型相关的数据类。
Intent匹配的算法流程
有很多图,下次在配啦~~
匹配组件的选择
如果有多个 intentFilter 对象与 intent,则需要在所在的对象中进行筛选。其最核心是 基于优先级 机制。
每个IntentFilter都有一个优先级(-1000~1000)。
IntentFilter.SYSTEM_LOW_PRIORITY
IntentFilter.SYSTEM_HIGH_PRIORITY
默认优先级是0,android:priority
在进行Intent匹配时返回的 32位整数,只作为错误码使用,与优先级无关。
Intent匹配的优化
通过引入 组件管理服务 ,降低了耦合但也增加了连接成本。优化的主要方法是 索引 、**缓存** 。
意图机制的使用
1.在界面组件activity中的应用
- 通过startActivity()
或者 startActivityForResult
调用。
- 调用组件可在 Intent 中添加一些 Flags:
Intent.FLAG_ACTIVITY_NEW_TASK
Inteng.FLAG_ACTIVITY_NO_FLAG
3.如果 组件管理服务 发现多个界面组件满足,则会 效率与公平 地选出。
- 效率:通过算法进行筛选,满足一下条件会直接选择A
- 公平:当无法通过效率方法选出时,则让用户选出。
2.在服务组件的应用
由于 服务组件 是在后台提供的,当出现多个匹配项时,Android默认优先级最高的组件。只要备用组件没有变化,对于同一个intent来说,其实现是固定的。 组件管理服务 会记录其对应的组件。
3.在触发器组件中的应用
触发器功能是监听广播事件的Intent对象,并对其进行解析和处理。事件信息的载体就是 itnent本身。在触发器组件的构造中,不存在匹配组件这样的问题。
总结
intent机制 被广泛应用于 界面组件的调用 、**服务组件的调用和绑定** 以及 触发器组件的调用 。
声明:eoe文章著作权属于作者,受法律保护,转载时请务必以超链接形式附带如下信息
原文作者: guanMac