Android 进阶解密阅读笔记11

前面从 WindowManagerGlobal 角度整理了 addView, updateView 等工作内容,发现最终会通过 WMS 完成处理,这期就对 WindowManagerService 进行整理。

WMS 的职责及相关类

WMS 的职责有点类似 AMS,但我觉得比 AMS 更会复杂,不是说其自身功能很强大,而是说它需要协助其他系统来完成很多事情,所处的位置很关键。主要的功能有,

  • 窗口管理
    负责窗口的启动,添加,删除还有窗口属性调整。
  • 窗口动画
    可以理解为在窗口与窗口间进行切换时,是通过动画做过渡的,从而不会显得单调死板。
  • 输入系统的中转站
    用户交互产生的输入事件需要通过合适的窗口处理表现出来,不然用户会觉得有问题,那么这些输入事件就会由 IMS(InputManagerService) 交给 WMS 进行转接。
  • Surface 管理
    窗口的绘制要交给 Surface,WMS 需要为窗口分配 Surface。
WindowManagerService.jpg

上图就是根据我对 WMS 职责的理解画的一个图,其中涉及到一些重要变量,

  • mFinishedStarting
    是一个 ArrayList 类型的数组,AppWindowToken 又是 WindowToken 的子类。它可以理解为窗口令牌,就是说在申请窗口创建时,需要带上令牌才行。还有一个作用是它会将同一个组件的窗口集合在一起便于管理。
  • mInputManager
    InputManagerService 类型,用于与 WMS 对接,将输入事件传达到恰当的窗口进行处理。
  • mH
    H 类型,用于将任务加入到主线程的消息队列。
  • mPolicy
    WindowManagerPolicy 类型,窗口管理策略。用于定义一些窗口规范等,其实现类为 PhoneWindowManager。
  • mSessions
    是一个 ArraySet 类型的数组,Session 用于应用进程与 WMS 所在的系统服务进程进行跨进程通信,一个 Session 可以理解为一个应用进程。
  • mAnimator
    WindowAnimator 类型,用于管理窗口的动画及特效。
  • mWindowMap
    是一个 HashMap 类型的集合,WindowState 用于保存窗口的信息,可以理解为一个 WindowState 代表一个窗口。

WMS 的创建

在 API 29 的源码中,WMS 的创建细节和书中描述的略有差别,但主要逻辑思路没有变,结合下面这张图会更好理解 WMS 的创建过程。

WMS 的创建.jpg

简单来说 WMS 是在系统服务进程中创建启动的,如同 AMS 一样,只不过优先级比较低。而整个创建过程会涉及到 3 个线程,如上图所示。从 system_server 线程发起创建,再到 android.display 线程 new 出 WMS 的对象实例,接着又进入 android.ui 线程初始化 PWM 即窗口管理策略实体类,最后又回到 system_server 线程完成剩下的工作,例如 displayReady 初始化屏幕显示信息。

你可能感兴趣的:(Android 进阶解密阅读笔记11)