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

重学安卓:Activity 的快乐你不懂!刚被告知,我开源的《Jetpack MVVM 最佳实践》项目,被对标阿里 P7 架构师的 价格 6000 多元的某课程,安排了 2 章节 12 课时 拿去给 2300 多名学员讲课。 事实上,这个项目的设计和维护 投入了我个人几乎所有空余的精力:为了方便开发者们无痛理解每个架构…

公告

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

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

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

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

前言

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

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

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

我是一块板砖

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

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

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

我是 Surface Flinger

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

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

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

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

我是 Window

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

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

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

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

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

我是一个会套娃的 View

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

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

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

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

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

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

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

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

于是我改名叫 Activity

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

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

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

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

综上

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

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

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

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

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

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

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

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

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

视图控制器系列:

Activity 生命周期 3 个辟谣

绝不丢失状态 Activity 重建机制

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

Intent 好比择偶标准

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

版权声明

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

Copyright © 2019-present KunMinX

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

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

今天的文章重学安卓:Activity 的快乐你不懂!分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/18661.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注