WMS(一):概述诞生和增加删除

152 阅读2分钟

1、WMS做啥用的的

image.png

窗口管理

WMS是窗口的管理者,它负责窗口的启动、添加和删除,另外窗口的大小和层级也是由WMS进行管理的。窗口管理的核心成员有DisplayContent、WindowToken和WindowState。

窗口动画

窗口间进行切换时,使用窗口动画可以显得更炫一些,窗口动画由WMS的动画子系统来负责,动画子系统的管理者为WindowAnimator。

输入系统的中转站

通过对窗口的触摸从而产生触摸事件,InputManagerService(IMS)会对触摸事件进行处理,它会寻找一个最合适的窗口来处理触摸反馈信息,WMS是窗口的管理者,因此,WMS“理所应当”的成为了输入系统的中转站。

Surface管理

窗口并不具备有绘制的功能,因此每个窗口都需要有一块Surface来供自己绘制。为每个窗口分配Surface是由WMS来完成的。

image.png

比如我们拍摄纪录片 《士兵风采》

ViewRootImpl像班长,管理所有的士兵(View)

WMS 则是导演,它和班长沟通,让士兵怎么做。然后班长落实。

SurfaceFling 是摄影师,捕捉当前画面

2. WMS的重要成员

1. mPolicy:WindowManagerPolicy

是一个接口。用来制定规范的。PhoneWindowManager是实现类

2. mSessions:ArraySet<Session>

其他的应用程序进程想要和WMS进程进行通信就需要经过Session

image.png

image.png

3. mWindowMap:WindowHashMap

key值的类型为IBinder,value值的类型为WindowState。WindowState用于保存窗口的信息,在WMS中它用来描述一个窗口。zWindowMap就是用来保存WMS中各种窗口的集合。

4.mFinishedStarting:ArrayList<AppWindowToken>

WindowToken 程序向WMS创建新窗口要一个令牌

WindowToken结构,应用程序中每个Activity都对应一个AppWindowToken。WindowToken会将相同组件(比如Acitivity)的窗口(WindowState)集合在一起,方便管理。

WindowState WindowState用于保存窗口的信息。APP端一个Window,就会在WMS端就会有一个WindowState。

5、mResizingWindows:ArrayList<WindowState>

mResizingWindows是用来存储正在调整大小的窗口的列表

6.mInputManager:InputManagerService

InputManagerService类型的变量,输入系统的管理。WMS是窗口的管理者,因此,WMS“理所应当”的成为了输入系统的中转站,

3、WMS的诞生

SystemServer的run,会创建一堆服务。startOtherServices来启动WMS的

image.png

1、system_server线程调用WMS.main(),创建WMS,

2、创建WMS的过程运行在"android.display",它的优先级更高等,结束后唤醒等待中的system_server

4、android.display运行 new WMS``和initPolicy

5、这两个方法运行完之后跑.有来个优先级更高的android.ui线程,跑完PhoneWindowManager.init之后。然后唤醒dispaly线程。

6、最后运行System_server线程的wms.displayReadyWMS.systemReady

其中让某个线程优先执行,用的是runWithScissors(),里边有个postAndWait

image.png

4、#### Window添加(WMS部分)

窗口检查

处理WindowToken

WindowState创建和处理

配置和穿件DisplayCOntent

5、#### Window删除(WMS部分)

WMS删除窗口.png