第八章 WindowManagerService.md
8.1 WMS 的职责
-
窗口管理
核心成员有 DisplayContent、WindowToken 和 WindowState,负责窗口的启动、添加和删除以及大小和层级。
-
窗口动画
动画子系统的管理者是 WindowAnimator
-
输入系统的中转站
InputManagerService 会对触摸事件进程处理,一般为将事件交给 WMS 来获取反馈。
-
Surface 管理
为每个窗口分配 Surface
8.2 WMS 的创建过程
这里涉及到三个线程的关系:
分为三个步骤:
- 在 system_server 线程中执行 SystemServer 的 startOtherServices 方法,在 startOtherServices 方法中会调用 WMS 的 main 方法,main 方法会创建 WMS,创建过程在 android.display 线程中实现。而创建过程中 system_server 线程一直处于阻塞状态等待 WMS 创建完毕。
- 在 WMS 创建过程中会调用 WMS 的 initPolicy 方法,其中又会调用 PWM.init (WindowManagerPolicy) 方法,该方法在 android.ui 线程中执行,PWN.init() 方法执行过程中 android.display 线程处于阻塞状态
- PWM 的 init 方法执行后,android.display 线程停止阻塞,WMS 创建完毕,system_server 线程停止阻塞,继续执行之后的 WMS.display() 方法来初始化屏幕显示信息。
8.3 WMS 的重要成员
这里给出部分成员变量:
-
mPoilicy :
WindowManagerManagerPolicy
WMP 是窗口管理策略的接口类,代表一个策略。其具体实现类为 PhoneWindowManager,该实现类在 WMS 创建时创建,WMP 允许定制窗口层级和特殊窗口类型以及关键的调度和布局。
-
mSessions :
ArraySet<Session>
主要用于进程通讯,具体看之前的 WindowManager 与 WMS 通讯
-
mWindowMap :
WindowHashMap
WindowHashMap 继承与 HashMap,设定了 key 为 IBinder 类型,value 为 WindowState 类型。mWindowMap 就是用来保存 WMS 中各种窗口的集合
-
mFinishedStarting :
ArrayList<AppWindowToken>
AppWindowToken 继承于 WindowToken。其中 WindowToken 主要有两个作用:
- 窗口令牌,当应用程序需要向 WMS 申请新创建一个窗口,则需要向 WMS 出示有效的 WindowToken。AppWindowToken 主要用来描述应用程序的 WindowToken 结构,应用程序中每个 Activity 都对应一个 AppWindowToken
- WindowToken 也用于标记一组 WindowState 属于同个组件( Activity ),只要他们创建的时候出示同一个 AppWindowToken
-
mResizingWindows :
ArrayList<WindowState>
用来储存正在调整大小的窗口的列表,同样的还有各种其他的容器,用于存储在内存耗尽时需要强制删除的 Surface,或者需要被销毁的 Surface,或者等待销毁的 Surface。在窗口正在调整大小时,旧的 Surface 需要一直保持,直到新的 Surface 完成绘制,这里需要一种缓冲。
-
mAnimator :
WindowAnimator
用于管理窗口动画
-
mH :
H
系统的 Handler 类
-
mInputManager :
InputManagerService
输入系统的管理者。IMS 会对触摸事件进行管理,会在 WMS 中寻找合适的窗口处理该事件。
8.4 Window 的添加过程 (PASS)
总结:
- 对所有添加的窗口进行检查,如果不满足一些条件,则添加失败
- WindowToken 相关的处理,有的窗口类型需要提供 WindowToken,有的窗口类型需要由 WMS 隐式创建 WindowToken
- WindowState 的创建和相关处理,将 WindowToken 与 WindowState 相关联
- 创建和配置 DisplayContent,完成窗口添加到系统前的准备工作
8.5 Window 的删除过程 (PASS)
总结
- 检查删除线程的正确性
- 从 ViewRootImpl 列表、布局参数列表和 View 列表中删除与 V 对应的元素
- 判断是否可以直接执行删除操作,如果不能就推迟删除操作
- 执行删除操作,清理和释放与 V 有关的一切资源