本文由做者 KunMinX 原创,已受权某公众号独家转载 🔥框架
本文原本是本身复盘 Android 知识梳理用的,没想到在上周部门内部的知识测评中发现,同事们对这些基础知识的掌握良莠不齐,甚至能够说是模棱两可。学习
是网上关于 Activity 的教程太少了吗?不是的,偏偏相反,网上的信息多如牛毛,却没有一篇愿意费哪怕一丝丝的笔墨 来介绍 Activity 的起源、它的职责边界、它的存在究竟是为了解决什么问题、咱们学习它,到底学到什么程度才算掌握。优化
正由于对这些最基本而必要的概念模棱两可,使得教程再多、再优秀,也没多少人能消化、能记住。因而我抱着试试看的心态,在通过几番润色过,将本身复盘的结果,在小会上分享出来供同事们享用。想不到本来不屑听的几个同事,在听完这番讲解后,连说真香。3d
因此若是你由于本文,而对 Activity
乃至向上追溯的 View
、Window
、WindowManager
、WindowManagerService
、Surface
、Surface Flinger
各自的起源、职责边界以及相互间的关系有了最基本的感性认识,继而不知不觉地开始有了一丝丝好奇,推进你深刻地去探究,那个人愿望也就达到了。code
我是一块运行着原始 Android 系统的板砖。我有一块屏幕,人们只要经过硬件抽象层(HAL)的代码对屏幕发起指令,屏幕上就能够显示人们想看到的内容。然而这么作过于原始,也不契合板砖的使用场景。cdn
因而有人考虑在 HAL 之上的运行时层(ART)用 C++ 封装一个服务,该服务的名称就叫 Surface Flinger。blog
我是 Surface Flinger,个人职责是专门负责 UI 内容的渲染。继承
人们想要在屏幕上渲染出什么内容,均可以经过我来间接地与屏幕打交道。这就比如你在电脑上排版好的文档,只需经过打印机驱动程序这个中介,就能帮助你将文档内容输出到纸上。教程
至于内容自己究竟有些什么,这我无论,我只负责统一地、有序地将内容安排成输出设备能理解的方式,来实现输出。递归
这块板砖的主人不只想要渲染 UI,还想要窗口,因而在应用框架层,经过 Java 封装了我。
人如其名,我就是一个窗口,我负责可视化内容的排版,而后将排版结果,经过个人上司 WindowManager,经过进程通讯的方式,去与后台服务 WindowManagerService 通讯,最终递交到 Surface Flinger 来输出和呈现。
Surface Flinger 为咱们每个 Window 都映射了一块 Surface,来用于管理和渲染屏幕内容。
然而做为一个 Window,我也有个人苦衷。
主人由于常常听 Window 大哥抱怨排版的负担过重,因而用组合模式封装了我。个人 “有容乃大” 版本:ViewGroup,由于组合模式,而可以在自身内部存在更多的 View 或 ViewGroup,这使得咱们从结构上来看,就像套娃。
托递归的福,咱们的排版工做:Measure、Layout、Draw,能够本身经过如此般的递归,自下往上地完成。而后 Window 大哥就能够直接拿着咱们的排版结果,去向上司交差啦。
原本 Window 正寻思着,日子过得这般悠闲自在,没想到好日子到头 —— 主人不只要一个窗口,还想要多窗口。这多窗口它就涉及到窗口间的切换、通讯等等,甚是麻烦,这些脏活累活要是交给之后的开发者来干,那我不得留下一世骂名、遗臭万年??!
想到这里我就感受哆嗦,不行,为了我一世英名,我得向主人进言。
其实早在 20000 多年前,女娲造人的时候,便采用了神级的模板方法模式,将一系列的通用功能都封装好,只暴露一些 DNA 接口,以供后来者随机输入和演变。
换言之,主人只需以模板方法模式的方式将我从新封装,而且编写一套管理窗口的任务和返回栈机制在背地里指挥若定,那么将来的开发者就只需继承我,而获得一个简练的配置模板,从而在模板上面输入他们的定制内容,以获得他们想要的结果。
Window 成了我永恒不变的信仰,存留在个人体内。对于开发者来讲,我就是个待继承的 Activity,开发者经过继承我,拿到的就是一个个简练的模板。
对系统来讲,个人本质还是被管理的窗口,系统可以管理我和其余窗口的切换和通讯。
对开发者来讲,个人本质是视图控制器,开发者经过我能够控制 View 以他们想要的方式进行排版,而且在特殊情况下保存和恢复 View 的排版内容。
最开始只有一块运行着原始 Android 系统的板砖。
Surface Flinger 的出现是为了更加方便地完成 UI 渲染。
Window 的出现是为了管理 UI 内容的排版。
Window 不堪重负因而将责任下发到 View 身上。
View 经过组合模式,在递归的帮助下蹭蹭蹭地完成排版工做。
Activity 的出现是为了知足多窗口管理和傻瓜式视图管理的须要。
因此 Activity 的知识边界无非就是生命周期、特殊情况致使的重建、多窗口跳转(启动模式、intent)、视图的加载和优化等等。
这样说,你理解了吗?
看不过瘾?这里只为你 而准备了一份 简洁有力的 《重学安卓》认知地图 😉