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的主要成员