往期回顾,专栏目录,更新动态,优惠政策,版权须知
温馨提示:如这是第一次接触《重学安卓》,可通过上述链接快速了解《重学安卓》专栏,获取 专栏目录、试读内容、更新动态 和 发展状况。
截至目前,专栏已对 体系化文章 实施 3310 余次修订,数十位群友告诉我,受专栏启发 亦开启了写作之路。群里不定期会有小伙伴讨论适配问题、分享原创开源库 和 提供内推机会,订阅后可随时进群交流。
·
Note 2021.5.25 重要提示:
阅读本文最佳时机是,您已吃过 阅读 “源码” 或 “源码分析文” 时 找不到头绪的苦。
您还没吃过苦,那您先不要着急阅读本文。您得吃过苦,才会有体会。
在您吃够这方面苦后,您才有机会发现,本文正是专用于解决 “如何找到正确打开方式” 的困扰。
我们绝不通篇贴源码,而是基于广泛实践和反思,在累积过大量样本 乃至足以排除掉所有干扰信息后,点到为止揭露 Intent 框架最核心本质,方便您理解其真实的存在意义,乃至笃信使用项目中。
前言
前几期,我们分别深入浅出介绍 进程模式、生命周期、重建机制、状态管理 设计依据、职责边界及相互间关系,且有效区分 任务 和 返回栈 乃至正确理解 启动模式 本质。
原本 Activity 复盘告一段落,没想掐指一算还差一篇 —— Activity 页面跳转路由机制,
且由于下一篇 Fragment 涉及对 “Activity 和 Fragment 路由机制区别和联系” 拆解,
故本篇决定就 “路由、组件、Intent 匹配机制” 来龙去脉做个铺垫,相信阅读后会让你醍醐灌顶。
文章目录一览
- 前言
- 关于 Intent 7 个深度思考
- 为何存在路由设计?
- 为何存在三大组件设计?
- 为何让 Binder 来当媒婆?
- Intent 存在哪几种类型?为何存在这样区别?
- 隐式 Intent 匹配依据?
- IntentFilter 概念和作用为何?
- 基于 Intent 和 IntentFilter 匹配规则提炼 4 要点
- Intent 3 个实用方法
- Intent 使用 7 个注意事项?
- 综上
为何存在路由设计?
路由本质即 “寻址和数据转发”。路由概念源于计算机网络。
正因这是一 普适化、标准化、适用于 “页面跳转和通信” 解决方案,因而 Android 亦沿用该机制完成页面跳转和通信。
下文我们皆以 “路由” 指代 “页面跳转和通信”。
为何存在三大组件设计?
在 《重学安卓:Activity 快乐你不懂》 一文,我们已分析 Activity 存在缘由:
是基于 “模版方法模式”、将 “页面跳转” 和 “生命周期管理” 交给系统在背后运筹帷幄、开发者只需拿到 “继承的简洁模板” 去填充自己的代码。
故正如 Activity 是对 Window 的模板化,Service、Broadcast 这 2 组件,本质上亦是待继承和填充的模板 —— 为方便开发者的使用而存在。
也因此,它们背后拥有同一套 “进程间通信” 路由机制,帮助它们完成相互间路由。
在这套机制中,Binder 好比通风报信媒婆,Intent 好比择偶标准。
为何让 Binder 来当媒婆?
我们知道,Binder 是 Android 下 “进程间通信” 方式,
那为何路由的事,要设计成给 Binder 去做?
—— 因考虑到有 “进程间通信” 需要 —— Android 系统被设计为,不仅可与当前 App 的组件通信,也可调用其他 App 的组件,故需 Binder 来完成进程间通信。
那为何要设计成可调用其他 App 的组件?
—— 以开发日记软件为例,为添加照片,开发者非自己写个相册模块么?未必,通过路由机制,即可调用系统相册获取所需照片。
在这个过程中,Binder 通风报信,Intent 则提供选取照片标准,例如筛出 PNG 格式照片。
Intent 存在哪几种类型?为何存在这样区别?
这主要看 “人”。
世间只存在两类人:一类是目标明确、知道自己想要什么;另一类是目标不明确、只能给出个大致条件。
那么前者给出的择偶标准,即显式 Intent,也即她会事先明确指出 “我要翻某人牌”。
也即,通过setComponent()、setClass()、setClassName() 或 Intent 构造函数 明确指定目标组件名称或类,即是显式 Intent。例如:
后者给出的是一系列指标,凡处于这些指标基准区间的,皆可考虑。
也即,隐式 Intent 不事先明确指出目标组件,而是通过给出条件项,来匹配潜在符合条件的组件,并在对应组件列表中,供用户挑选心仪的那一个。例如:
特别提示:网上对 “显式、隐式 Intent 区别” 讹传屡见不鲜。
源于讹传者未正确区分 “显式和隐式” 概念,认为 “只有往 Intent 传入 class 那种写法才是显式”,且认为只有 “隐式” Intent 可去访问别的 App 组件。
这样说法显然没有事实依据。
显式隐式本质区别,正如本小节中所述,
且不管是显式 Intent 还是隐式 Intent,只要被访问的外部 App 目标组件在 manifest 中 exported 属性为 true,那么就可访问。
划重点 👆👆👆
那用于匹配的指标都有哪些?
隐式 Intent 匹配依据?
拿去和谁匹配?匹配规则是什么?
IntentFilter 概念和作用为何?
IntentFilter 是专用于 声明 “隐式启动” 的筛选条件。
系统正是通过 “匹配 Intent 和 IntentFilter 条件项” 启动相应组件。
IntentFilter 是在清单文件中配置,作为组件 XML 元素的子元素。一个组件元素可包含多个 IntentFilter 元素。
IntentFilter 包含 action、category、data 三种子元素,且 这三种子元素都可分别配置多个。