0
点赞
收藏
分享

微信扫一扫

Android进阶解密读书笔记(八)——理解WindowManagerService

Ewall_熊猫 2022-04-14 阅读 125
android

1、WMS的职责,主要有以下几点:

  • 窗口管理:WMS是窗口的管理者,它负责窗口的启动、添加和删除,另外窗口的大小和层级也是由WMS进行管理的。窗口管理的核心成员有DisplayContent、WindowToken和WindowState
  • 窗口动画:窗口间进行切换时,使用窗口动画可以显得更炫一些,窗口动画由WMS的动画子系统来负责,动画子系统的管理者为WindowAnimator
  • 输入系统的中转站:通过对窗口的触摸而产生触摸事件,InputManagerService(IMS)会对触摸事件进行处理,它会寻找一个最合适的窗口来处理触摸反馈信息,WMS是窗口的管理者,它作为输入系统的中转站再合适不过
  • surface管理:窗口并不具备绘制的功能,因此每个窗口都需要有一块surface来供自己绘制,为每个窗口分配surface是由WMS来完成的

2、WMS的创建过程

WMS创建涉及3个线程,分别是system_server、android.display和android.ui

三个线程之间的关系分为三个步骤来实现:

  1. 首先在system_server线程中执行了SystemServer的startOtherServices方法,在startOtherServices方法中会调用WMS的main方法,main方法会创建WMS,创建的过程再android.display线程中实现,创建WMS的优先级更高,因此system_server线程要等WMS创建完成后,处于等待状态的system_server线程才会被唤醒从而继续执行下面的代码
  2. 在WMS的构造方法中会调用WMS的initPolicy方法,在initPolicy方法中又回调用PWM的init方法,PWM的init方法在android.ui 线程中运行,它的优先级要高于android.display线程,因此android.display线程要等PWM的init方法执行完毕后,处于等待状态的android.display线程才会被唤醒从而继续执行下面的代码
  3. PWM的init方法执行完毕后,andorid.display线程就完成了WMS的创建,等待的system_server线程被唤醒后继续执行 WMS的main方法后的代码逻辑,比如WMS的displayReady方法用来初始化屏幕的显示信息

3、WMS的重要成员

下面介绍部分成员变量:

(1)mPolicy:WindowManagerPolicy

mPolicy是WindowManagerPolicy(WMP)类型的变量。WindowManagerPolicy是窗口管理策略的接口类,用来定义一个窗口策略所要遵循的通用规范,并提供了WindowManager所有的特定的UI行为。它的具体实现类为PhoneWindowManager,这个实现类在WMS创建时被创建。WMP允许定制窗口层级和特殊窗口类型以及关键的调度和布局

(2)mSessions:ArraySet

mSessions是ArraySet类型的变量,元素类型为Session,它主要用于进程间通信,其他的应用程序进程想要和WMS进程进行通信就需要经过Session,并且每个应用程序进程都会对应一个Session,WMS保存这些Session用来记录所有向WMS提出窗口管理服务的客户端

(3)mWindowMap:WindowHashMap

mWindowMap是WindowHashMap类型的变量,WindowHashMap继承了HashMap,它限制了HashMap的key值的类型为IBinder;value值的类型为WindowState。WindowState用于保存窗口的信息,在WMS中它用来描述一个窗口。综上得出结论,mWindowMap就是用来保存WMS中各种窗口的集合

(4)mFinishedStarting:ArrayList

mFinishedStarting是ArrayList类型的变量,元素类型为AppWindowToken,它是WindowToken的子类,WindowToken主要有两个作用:

  • 可以理解为窗口令牌,当应用程序想要向WMS申请新创建一个窗口,则需要向WMS出示有效的WindowToken。AppWindowToken作为WindowToken的子类,主要用来描述应用程序的WindowToken结构,应用程序中每个Activity都对应一个AppWindowToken
  • WindowToken会将同一个组件(比如同一个activity)的窗口(WindowState)集合在一起,方便管理

mFinishedStarting就是用于存储已完成启动的应用程序窗口(比如activity)的ApplicationToken的列表

还有类似的mFinishedEarlyAnim存储了已经完成窗口绘制并且不需要展示任何已保存surface的应用程序窗口的AppWindowToken;mWindowReplacementTimeouts存储了等待更换的应用程序窗口的AppWindowToken,如果更换不及时,旧窗口就需要被处理

(5)mResizingWindows:ArrayList

mResizingWindows是ArrayList类型的变量,元素类型为WindowState,它是用来存储正在调整大小的窗口的列表

(6)mAnimator:WindowAnimator

mAnimator是WindowAnimator类型的变量,用于管理窗口的动画以及特效动画

(7)mH:H

nH是H类型的变量,系统的Handler类,用于将任务加入到主线程的消息队列中

(8)mInputManager:InputManagerService

mInputManager是InputManagerService类型的变量,输入系统的管理者。InputManagerService(IMS)会对触摸事件进行处理,它会寻找一个最合适的窗口来处理触摸反馈信息,WMS是窗口的管理者,因此作为输入系统的中转站是再合适不过了

4、Window的添加过程(WMS处理部分)

无论是系统窗口还是Activity,他们的Window的添加过程都会调用WMS的addWindow方法

addWindow方法分为了3个部分,主要做了下面4件事:

  • 对所要添加的窗口进行检查,如果窗口不满足一些条件,就不会再执行下面的代码逻辑
  • WindowToken相关的处理,比如有的窗口类型需要提供给WindowToken,没有提供的话就不会执行下面的逻辑,有的窗口类型则需要由WMS隐式创建 WindowToken
  • Window State的创建和相关处理,将WindowToken和WindowState相关联
  • 创建和配置Display Content,完成窗口添加到系统前的准备工作

5、Window的删除过程

删除Window需要先调用Window ManagerImpl的removeView方法,在removeView方法中又会调用WindowManagerGlobal的removeView方法

总结为以下几点:

  • 检查删除线程的正确性,如果不正确就抛出异常
  • 从ViewRootImpl列表、布局参数列表和View列表中删除与View对应的元素
  • 判断是否可以直接执行删除操作,清理和释放与View相关的一切资源
举报

相关推荐

0 条评论