WMS初步探索

645 阅读3分钟

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 来完成的。

image.png

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的工作方式

image.png

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通信

image.png

2.5.1 内部组织方式

当一个新的Activity被启动时(startActivity),它首先需要在AMS中注册--此时,AMS会在内部生成一个ActivityRecord来记录这个activity,另外因为Activity是四大组件中专门 用于UI显示的,所以,wms也会对其进行记录-以WindowState来表示。

image.png

另外,wms除了利用WindowState来保存一个“窗口”相关的信息外,还使用AppWindowToken来对应AMS中的一个ActivityRecord。这样三者就可以形成非常紧密的联系。

2.6 窗口属性

image.png