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