1、WMS做啥用的的
窗口管理
WMS是窗口的管理者,它负责窗口的启动、添加和删除,另外窗口的大小和层级也是由WMS进行管理的。窗口管理的核心成员有DisplayContent、WindowToken和WindowState。
窗口动画
窗口间进行切换时,使用窗口动画可以显得更炫一些,窗口动画由WMS的动画子系统来负责,动画子系统的管理者为WindowAnimator。
输入系统的中转站
通过对窗口的触摸从而产生触摸事件,InputManagerService(IMS)会对触摸事件进行处理,它会寻找一个最合适的窗口来处理触摸反馈信息,WMS是窗口的管理者,因此,WMS“理所应当”的成为了输入系统的中转站。
Surface管理
窗口并不具备有绘制的功能,因此每个窗口都需要有一块Surface来供自己绘制。为每个窗口分配Surface是由WMS来完成的。
比如我们拍摄纪录片 《士兵风采》
ViewRootImpl像班长,管理所有的士兵(View)
WMS 则是导演,它和班长沟通,让士兵怎么做。然后班长落实。
SurfaceFling 是摄影师,捕捉当前画面
2. WMS的重要成员
1. mPolicy:WindowManagerPolicy
是一个接口。用来制定规范的。PhoneWindowManager是实现类
2. mSessions:ArraySet<Session>
其他的应用程序进程想要和WMS进程进行通信就需要经过Session
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的
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.displayReady 和WMS.systemReady
其中让某个线程优先执行,用的是runWithScissors(),里边有个postAndWait
4、#### Window添加(WMS部分)
窗口检查
处理WindowToken
WindowState创建和处理
配置和穿件DisplayCOntent