重学安卓1-5:Intent 好比择偶标准

作品简介
往期回顾专栏目录更新动态优惠政策版权须知
温馨提示:如这是第一次接触《重学安卓》,可通过上述链接快速了解《重学安卓》专栏,获取 专栏目录、试读内容、更新动态 和 发展状况。
截至目前,专栏已对 体系化文章 实施 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 三种子元素,且 这三种子元素都可分别配置多个


Intent 和 IntentFilter 匹配规则 4 要点


创作时间: