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。这样三者就可以形成非常紧密的联系。