1. 需要WMS来做什么事情
Window是窗口,Manager是管理者。从SurfaceFlinger的角度,wm就是一个Layer,承载着界面有关的数据和属性。从wms角度来看,wm就是一个WindowState,用于管理和界面相关的状态。不管是SurfaceFlinger,还是WMS,他们都是为了更好的完成当前的窗口管理。从计算机I/O角度,WMS至少需要完成两个方面:
-
全局的窗口管理(output)
从计算机体系结构的角度,“窗口管理”属于输出部分,应用程序的显示和请求都在SurfaceFlinger和wms的协助下有序的输出给物理屏幕或者其他的显示设备。
-
全局的事件管理派发(Input)
SurfaceFlinger只做和“显示”相关的问题,WMS还需要兼顾事件输入的派发。键盘(过时)、触摸屏(主流)、鼠标(过时)、轨迹球(过时)都属于这一类的设备
1. 窗口管理
WMS 是窗口的管理者,它负责窗口的启动、添加和删除。另外窗口的大小和层级也是由 WMS 进行管理的。窗口管理的核心成员有 DisplayContent、WindowToken 和 WindowState.
2. 窗口动画
窗口间进行切换时,使用动画可以显得更炫一些,窗口动画由 WMS 的动画子系统来负责,动画子系统的管理者为 WindowAnimator。
3. 输入系统中转站
通过对窗口的触摸从而产生触摸事件,InputManagerService(IMS) 会对触摸事件进行处理,它会寻找一个最合适的窗口来处理触摸反馈信息,WMS 是窗口的管理者,它作为输入系统的中转站再合适不过了。
4. Surface 管理
窗口不具备绘制功能,因此每个窗口都需要有一块 Surface 来供自己绘制,为每个窗口分配 Surface 是由WMS 来完成的。
2. WMS的设计思路
2.1 wms基本概述
2.1.1 wms基本属性
WMS是一个系统级的服务,它应该具备如下几个属性。
- 由SystemServer启动
- 直到系统关机时才退出
- 在wms发生崩溃时,一定要自己有重启的功能
2.1.2 surfaceFlinger
surfaceFlinger和wms存在当前很多联系
2.1.3 窗口显示应用程序
不同的应用程序窗口存在一定的优先级
2.1.4 InputManagerService
wms是派发系统按键和触摸消息的最佳人选
2.1.5 AMS
AMS和WMS之间存在一定的交互。
2.1.6 Binder通信
SurfaceFlinger,ams和wms之间通信都使用的是Binder。
2.1.7 wms核心功能概括
-
窗口的新增和删除
当某个进程(普通应用和系统应用)有需求显示时,它可以请求wms添加一个窗口,并且在不需要的时候将其移除
-
启动窗口
-
窗口的动画
-
窗口的大小
-
窗口的层级
-
事件分发
2.2 wms的启动
wms是在SystemServer众多服务中的一种,这个在SystemServer.java的源码中就可以看得出来。
2.3 wms的基础功能
wms的功能太过复杂,可以查看IWindowManagerService.java接口源码。
2.4 wms的工作方式
2.4.1 事件传递
wms会和wmHandlerThread进行通信,然后将事件通过队列的方式去处理。
2.4.2 直接调用
wsm判断是否锁屏的接口是wms直接实现的,并没有走handler间接调用的。
public boolean isKeyguardLocked() {
return mPolicy.isKeyguardLocked()
}
2.5 wms,ams与activity之间的关系
一个activity启动的过程中需要多个系统服务处理,其中最为著名的就是ams和wms
2.5.1 IPC通信
2.5.1 内部组织方式
当一个新的Activity被启动时(startActivity),它首先需要在AMS中注册--此时,AMS会在内部生成一个ActivityRecord来记录这个activity,另外因为Activity是四大组件中专门 用于UI显示的,所以,wms也会对其进行记录-以WindowState来表示。
另外,wms除了利用WindowState来保存一个“窗口”相关的信息外,还使用AppWindowToken来对应AMS中的一个ActivityRecord。这样三者就可以形成非常紧密的联系。