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

前言

本文本来是自己复盘 Android 知识梳理用的,没想到在上周部门内部的知识测评中发现,同事们对这些基础知识的掌握参差不齐,甚至可以说是模棱两可。

是网上关于 Activity 的教程太少了吗?不是的,恰恰相反,网上的信息多如牛毛,却没有一篇愿意费哪怕一丝丝的笔墨 来介绍 Activity 的起源、它的职责边界、它的存在到底是为了解决什么问题、我们学习它,到底学到什么程度才算掌握。

正因为对这些最基本而必要的概念模棱两可,使得教程再多、再优秀,也没多少人能消化、能记住。于是我抱着试试看的心态,在经过几番润色过,将自己复盘的结果,在小会上分享出来供同事们享用。想不到原本不屑听的几个同事,在听完这番讲解后,连说真香。

所以如果你因为本文,而对 Activity 乃至向上追溯的 ViewWindowWindowManagerWindowManagerServiceSurfaceSurface Flinger 各自的起源、职责边界以及相互间的关系有了最基本的感性认识,继而不知不觉地开始有了一丝丝好奇,推动你深入地去探究,那我的愿望也就达到了。

文章目录一览

  • 前言
  • 我是一块板砖
  • 我是 Surface Flinger
  • 我是 Window
  • 我是一个会套娃的 View
  • …… 所以,Window 成了摸鱼般的存在吗?
  • 于是我改名叫 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

top Created with Sketch.