WindowManagerService (1)认识wms - l-feng/l-feng.github.io GitHub Wiki

一:wms的主要作用

要知道wms主要是干什么,当然得知道什么是窗口。窗口主要是屏幕上的一块用于绘制各种UI元素并且可以响应用户输入的矩形区域。从原理上来说,窗口独自占有一个surface。

Wms主要是为所有的窗口分配surface,掌管surface的显示顺序,以及位置尺寸,控制窗口动画,并且还是输入系统的一个重要的中转站

二:窗口的创建,绘制和销毁 1: 创建一个窗口的步骤:

   1.1 获取IWindowSession和WMS实例

   1.2 创建并且初始化WindowManager.LayoutParams。LayoutParams该类里面有一个type属性,该属性描述了窗口的类型。而窗口的类型正是

wms对于窗口进行order排序的依据

   1.3 向WMS添加一个窗口令牌

   1.4 向wms添加一个窗口

   1.5 向wms申请重新布局(relayout)

2:窗口的绘制

   2.1 通过Surface.lock()函数获取到可以在上面作画的canvas实例

   2.2 使用canvas实例进行作画

   2.3 通过Surface.unLockedCanvasAndPost()函数提交绘制结果

3:窗口的概念

客户端向wms添加一个窗口的过程,其实就是为wms分配一块surface的过程,一块块的Surface在wms的管理下有序的排布在屏幕上面,android才会

呈现精彩的界面

                        Android显示系统的三个层次

三:wms的创建过程

WMS的启动位于SystemServer.java中的ServiceThread类的run函数中,关于wms的创建分为三个部分。

1:创建具体的WMS实例

具体的创建是通过WindowManagerService中的静态函数main()创建WindowsManagerService的实例,注意main含有两个参数wmHandler和

uiHandler,这两个Handler分别运行于由ServiceThread所创建的两个名为“WindoManager”“UI”的两个HandlerThread中

Wm=WindowManagerService.main(context,power,display,inputManager,uiHandler,wmHandler,factoryTest!=SystemService.FACTORY_FAST_LOW_lEVEL,!firstBoot,onlyCore)

创建完成之后再添加到serviceManager中

ServceManager.addService(Context.WINDOW_SERVICE,wm)

2:初始化显示尺寸的信息,在displayReady之后,wms会要求AMS进行一次configuration更新。

Wm.displayReady();

3:通知wms,系统的初始化工作已经完成,在systemReady函数中,wms本身不会进行任何操作,直接调用mpolicy的systemReady函数进行。

Wm.systemReady();

Main函数在serviceThread专门为WMS创建了一个线程windowManager,wms中的looper等操作均在windowManager中进行。

四:wms的主要成员