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
三个线程之间的关系分为三个步骤来实现:
- 首先在system_server线程中执行了SystemServer的startOtherServices方法,在startOtherServices方法中会调用WMS的main方法,main方法会创建WMS,创建的过程再android.display线程中实现,创建WMS的优先级更高,因此system_server线程要等WMS创建完成后,处于等待状态的system_server线程才会被唤醒从而继续执行下面的代码
- 在WMS的构造方法中会调用WMS的initPolicy方法,在initPolicy方法中又回调用PWM的init方法,PWM的init方法在android.ui 线程中运行,它的优先级要高于android.display线程,因此android.display线程要等PWM的init方法执行完毕后,处于等待状态的android.display线程才会被唤醒从而继续执行下面的代码
- 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相关的一切资源