学习笔记-WMS 简述

https://wkmcyz.notion.site/WMS-d85f58e79d294d93ad4b5f6d18188b99 可以获得更好的阅读体验

学习笔记-WMS 简述

WindowManagerService,负责 Android 内 window 的展示管理,类似一个系统级别的 viewGroup。

WMS 的启动和初始化

在 system_server 启动的众多服务中,WMS 是十分重要的一个,和用户 app 以及其他的系统服务都会有很多交互。在 system_server 在 WMS 专门使用的线程上启动了 WMS 之后,WMS 会获取自己完成窗口管理所需要的内部对象。

app & WMS 的交互

应用添加 window 的流程简述

应用获取到 WMS 后,向 WMS 注册一个令牌对象,这个对象可以认为是后需添加的窗口的来源说明。然后使用一个特定的 layoutParam 添加窗口,说明窗口的布局信息以及特点等。窗口触发布局,获取一个 Surface 以用来绘制。在窗口不再使用的时候,移除窗口。在应用不再使用所有窗口的时候,移除其令牌。

添加窗口到 WMS 的时候,WMS 会判断窗口要添加到哪个显示屏幕上,Android 是可以有多个显示的屏幕的。

WMS 根据窗口的属性判断窗口的展示 z 值,不同类型的窗口其基本值也不同,展示优先级越高的(例如 ANR 提示窗口、输入法窗口)其基本值越大,相同基本值的,通常来说是后加入的窗口会在前面展示,也就是 z 值会大。

WMS 对窗口的布局

WMS 对窗口的布局,指的是 WMS 是如何将管理跌所有窗口进行排列的,这个步骤的输入是所有窗口以及其 layoutParams ,输出则是所有窗口的宽高、窗口在屏幕上的位置以及窗口的 zOrder。

WMS 对一个窗口进行布局,会在窗口的任何属性发生变化的时候进行。这包括 1)窗口的视图属性的变化,如宽高变化、位置变化、layoutParams 变化、可见度变化;2)窗口的状态属性变化,比如窗口被移除,窗口被添加,等。

WMS 在对一个窗口进行布局的时候,会检查所有的窗口是否有必要调整。因为某个窗口属性发生变化,可能会影响其他窗口的布局效果。因此 WMS 会对所有的窗口进行统一的关照,以防止其需要修改。
WMS 在布局后得到了窗口的位置以及尺寸,会将各个窗口的实际绘制的大小也设置为这个位置尺寸,后面便会进入每个窗口自己内部的绘制逻辑了(也就是应用的绘制逻辑)

相关类

应用添加 window 到 WMS

  • WindowToken , 用来表示应用身份的标识令牌。
  • IApplicationToken,Activity 在 WMS 里对应的 token。
  • WindowState,WMS 内的 Window 表示。
posted @ 2022-01-12 23:43  wkmcyz  阅读(339)  评论(0编辑  收藏  举报