重学安卓:Activity 的快乐你不懂!

26,027 阅读5分钟

公告

刚被告知,我开源的《Jetpack MVVM 最佳实践》项目,被对标阿里 P7 架构师价格 6000 多元某课程,安排了 2 章节 12 课时拿去给 2300 多名学员讲课。

事实上,该项目设计和维护投入我个人几乎所有空余精力:为方便开发者们无痛理解每个架构组件的存在缘由、职责边界,项目中精心设计高频应用场景,且代码中就各种 “为什么” 提供了丰富注释。

故对 Jetpack MVVM 感兴趣朋友,大可直接到 GitHub 访问该项目源码,以及从一而终 专注 “深度思考原则” 和 “业务架构模式” 分享 的《重学安卓》专栏文章。

详见 《开源项目被人拿去做课程卖了 1000 多万是什么体验》

前言

本文原是自己复盘 Android 知识梳理用,没想到在一次部门内部知识测评中发现,同事们对这些基础知识掌握参差不齐。

究其根本,网上 Activity 教程多如牛毛,然鲜有文章愿费笔墨介绍 Activity 起源、职责边界、它的存在到底是为解决什么问题、我们学习它,到底学到什么程度才算掌握。

正是对前置知识模棱两可,使教程再多、再优秀,也鲜有人能消化和记住。故今日我们一起来关注 Activity “来龙去脉”,相信阅读后你会豁然开朗。

我是一块板砖

我是一块运行着原始 Android 系统的板砖。我有一块屏幕,人们只需通过硬件抽象层(HAL)代码对屏幕发起指令,屏幕即可显示人们想看到内容。然这么做过于原始,也不契合板砖使用场景。

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

我是 Surface Flinger

我是 Surface Flinger,我的职责是专门负责 UI 内容渲染。

人们想在屏幕上渲染什么内容,都可通过我来间接与屏幕打交道。这就好比用户在电脑上排版好文档,只需通过打印机驱动程序这个中介,就能将文档内容输出到纸上。

至于内容本身究竟有些什么,这我不管,我只负责统一有序将内容安排成 “输出设备能理解方式” 实现输出。

我是 Window

人们不仅想渲染 UI,还想要窗口,于是在应用框架层,通过 Java 封装了我。

人如其名,我就是一窗口,负责图形化内容排版,然后将排版结果通过我上司 WindowManager,以进程通信方式去和后台服务 WindowManagerService 通信,最终递交给 Surface Flinger 输出和呈现。

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

然作为一个 Window,我也有我苦衷。

我是一个会套娃的 View

主人因经常听 Window 大哥抱怨排版负担太重,于是用组合模式封装我。我的 “有容乃大” 版本:ViewGroup,因组合模式,而能在自身内部存在更多 View 或 ViewGroup,这使我们从结构上看就像套娃。

托递归的福,我们可自行 “自下往上” 完成 Measure、Layout、Draw 排版工作。然后 Window 大哥便可直接拿着 “排版结果” 去向上司交差啦。

…… 故 Window 成了摸鱼般存在么?

本来 Window 寻思着,日子过得清闲自在,没想到好日子到头 —— 人们不仅要一个窗口,还想要多窗口。这多窗口它就涉及窗口间的切换、通信等等,甚是麻烦,这些脏活累活要是交给以后开发者来干,那我不得留下一世骂名、遗臭万年?

不行,为了一世英名,我得向主人进言。

其实早在 20000 多年前,女娲造人便采用神级 “模板方法模式”,将一系列通用功能封装好,只暴露一些 DNA 接口供后来者随机输入和演变。

换言之,主人只需以 “模板方法模式” 将我重新封装,且编写一套管理窗口的 “任务和返回栈机制” 在背后运筹帷幄,那么未来的开发者只需继承我得到一个个简练的配置模板,在模板上输入他们的定制内容,即可得到想要结果。

于是我改名叫 Activity

Window 成我永恒不变信仰,存留我体内。对开发者来说,我就是个待继承的 Activity,开发者通过继承我,拿到的即是一个个简练模板。

也即,对系统来说,Activity 本质仍是被管理的窗口,系统能管理窗口间切换和通信;

对开发者来说,Activity 本质是视图控制器,开发者通过 Activity,可控制 View 以他们想要方式进行排版,并在特殊状况下保存和恢复 View 排版内容。

综上

最开始只有一块运行着原始 Android 系统的板砖。

Surface Flinger 的出现是为方便完成 UI 渲染。

Window 的出现是为管理 UI 排版。

Window 不堪重负于是责任下发 View 身上。

View 通过组合模式,在递归帮助下高效完成排版工作。

Activity 的出现是为满足多窗口管理和傻瓜式视图管理需要。

故 Activity 知识边界无非即是 “生命周期、特殊状况导致的重建、多窗口跳转(启动模式、intent)、视图的加载和优化” 等等。

至此已简要完成对 Activity 起源与职责边界 梳理。后续我们逐一就 Activity 相关高频技术点作详细分析。

视图控制器系列:

Activity 生命周期 3 个辟谣

绝不丢失状态 Activity 重建机制

丢 offer,只因拎不清 Activity 任务和返回栈

Intent 好比择偶标准

我的碎片很听话,你的 Fragment 有自己想法

版权声明

本文以 CC 署名-非商业性使用-禁止演绎 4.0 国际协议 发行。

Copyright © 2019-present KunMinX

本文引言、思路及结论属于作者 KunMinX 原创,当您借鉴或引用本文的引言、思路、结论进行二次创作,或全文转载时,须注明链接出处,否则我们保留追责权利。