重学安卓1-1:Activity 缘起与职责边界

作品简介
往期回顾专栏目录更新动态优惠政策版权须知
温馨提示:如这是第一次接触《重学安卓》,可通过上述链接快速了解《重学安卓》专栏,获取 专栏目录、试读内容、更新动态 和 发展状况。
截至目前,专栏已对 体系化文章 实施 3310 余次修订,数十位群友告诉我,受专栏启发 亦开启了写作之路。群里不定期会有小伙伴讨论适配问题、分享原创开源库 和 提供内推机会,订阅后可随时进群交流。

·

Note 2021.5.25 重要提示
阅读本文最佳时机是,您已吃过 阅读 “源码” 或 “源码分析文” 时 找不到头绪的苦
您还没吃过苦,那您先不要着急阅读本文。您得吃过苦,才会有体会。
在您吃够这方面苦后,您才有机会发现,本文正是专用于解决 “如何找到正确打开方式” 的困扰。
我们绝不通篇贴源码,而是基于广泛实践和反思,在累积过大量样本、足以排除掉所有干扰信息后,界定 Activity 本质,方便您理解其真实的存在意义,乃至笃信使用项目中。

前言

作为高频接触的组件 Activity,人们回顾 Android 开发,自然首先是想到从 Activity 开始。

Activity 底层错综复杂,上来就直接看源码,容易把自己绕进去。

网上不乏源码分析文,但那毕竟不是读者自己主动或被动一步步推理得来,相互间也无逻辑关联,看完没印象在所难免。

为此请跟随笔者脚步,将 “Activity 及其上下游组件都是怎么来的” 从头捋一遍。

相信这样捋一遍后,对 “Activity 本质、上下游关系、业务范围” 能有个清晰定见,从而有的放矢源码查阅。

文章目录一览

  • 前言
  • Activity 本质与业务范围
  • v1:原始系统 和 硬件抽象层
  • v2:专职渲染 Surface Flinger
  • v3:为图形化排版而生 Window
  • v4:分摊排版套娃 View
  • … 故 Window 成摸鱼般存在?
  • v5:于是改名叫 Activity
  • Note 2019.11.9 加餐:
  • 从设计模式角度解析 Activity 和 Window 关系
  • 综上
  • Note 2020.1.29 加餐:
  • PhoneWindow、ViewRootImpl 本质与区别

Activity 本质与业务范围

先说结论:

Activity 子类是页面开发模板。

Activity 职责包含 Window,但不限于 Window。

Activity 是基于 模板方法模式组合模式 实现。

Activity 的存在是为了兼顾 “多窗口管理” 和 “傻瓜式视图管理”。

Activity 知识边界即 “生命周期、环境变化导致的重建、多窗口跳转、视图加载和优化” 等。

以下推导:

V1:原始系统 和 硬件抽象层

世间万物皆是 “从无到有” 完成演化,Android 系统也不例外。

最初,Android 研发团队手中有一块 “运行原始 Android 系统” 的设备,该设备有块屏幕,只需通过硬件抽象层(HAL)代码对屏幕发起指令,屏幕上即可显示预期内容。

然这么做过于原始,也不契合该设备使用场景。

于是考虑在 HAL 之上运行时层(ART)用 C++ 封装个服务,该服务名称就叫 Surface Flinger。

V2:专职渲染 Surface Flinger

每每想渲染复杂内容,都可通过 Surface Flinger 间接与屏幕打交道。

这过程就好比,在电脑上借助 WPS 排版好图文,然后通过 “打印机驱动程序” 这个中介,将文档内容输出纸上

也即 Surface Flinger 负责将图文内容安排成 “输出设备” 能理解的方式,统一有序输出。

V3:为图形化排版而生 Window

然而有了图形还不够,还需要窗口,于是在应用框架层,通过 Java 封装个 Window。

Window 负责 “图形化内容” 排版,然后 WindowManager 会以 “进程通信” 方式通知后台服务 WindowManagerService 去把 “排版结果” 交由 Surface Flinger 渲染输出。

Surface Flinger 为每个 Window 都映射一块 Surface,用于管理和渲染屏幕内容。

V4:分摊排版套娃 View

显而易见,Window 中的图形化元素,不仅有并列,也会有堆叠,如此排版负担就很重,

于是考虑用 组合模式 封装 View/ViewGroup。

凭借组合模式,ViewGroup 能轻易在自身内部嵌套更多 View 或 ViewGroup,从结构来看,就像套娃。

ViewGroup/View 可自行通过 递归 自下往上完成 Measure、Layout、Draw 排版流程,

于是 Window 可直接拿着 ViewGroup/View 排版结果,向 WindowManager 交差。


创作时间: