理解WindowManagerService
--摘自《Android进阶解密》
*WMS的职责*
1)窗口管理 WMS负责窗口的启动、添加和删除,另外窗口的大小和层级也是由WMS进行管理的
2)窗口动画 WMS的动画子系统WindowAnimator负责窗口间的切换动画
3)输入系统的中转站 InputManagerService会对触摸事件进行处理,寻找最合适的窗口来处理触摸反馈信息
4)Surface管理 WMS为每个窗口分配Surface来供自己绘制
*WMS的创建工程*
WMS是在SystemServer进程中创建的
上面三个线程实现三个步骤
1)首先在system_server线程中执行了SystemServer的startOtherServices方法,在startOtherServices方法中会调用WMS的main方法,main方法会创建WMS,创建的过程咋iandroid.display线程中实现,创建WMS的优先级更高,因此system_server线程要等WMS创建完成后,处于等待状态的system_server线程才会被唤醒从而继续执行下面的代码
2)在WMS的构造方法中会调用WMS的initPolicy方法,在initPolicy方法中又会调用PWM的init方法,PWM的init方法在android.ui线程中运行,它的优先级要高于android.display线程,因此“android.display”线程要等PWM的init方法执行完毕后,处于等待状态的android.display线程才会被唤醒从而继续执行下面的代码
3)PWM的init方法执行完毕后,android.display线程就完成了WMS的创建,等待的system_server线程被唤醒后继续执行WMS的main方法后的代码逻辑,比如WMS的displayReady方法用来初始化屏幕显示信息
知识点:
1)Watchdog用来监控系统的一些关键服务的运行状况
*WMS的重要成员*
1.mPolicy:WindowManagerPolicy 是窗口管理策略的接口类,用来定义一个窗口策略所要遵循的通用规范,并提供了WindowManager所有的特定的UI行为
2.mSessions:ArraySet 主要用于进程间通信,其他的应用程序进程想要和WMS进程进行通信就需要经过Session,并且每个应用程序进程都会对应一个Session
3.mWindowMap:WindowHashMap 用来保存WMS中各种窗口的集合
4.mFinishedStarting:ArrayList 用于存储已经完成启动的应用程序窗口(比如Activity)的AppWindowToken的列表
5.mResizingWindows:ArrayList 用来存储正在调整大小的窗口的列表
6.mAnimator:WindowAnimator 用于管理窗口的动画以及特效动画
7.mH:H 用来将任务加入到主线程的消息队列中
8.mInputManager:InputManagerService 输入系统的管理者
*Window的添加过程(WMS处理部分)*
WindowToken可以理解为窗口令牌,且会将一个组件(比如同一个Activity)的窗口(WindowState)集合在一起,方便管理
主要是以下4件事
1)对所要添加的窗口进行检查,如果窗口不满足一些条件,就不会再执行下面的代码逻辑
2)WindowToken相关的处理,比如有的窗口类型需要提供WindowToken,没有提供的话就不会执行下面的代码逻辑,有的窗口类型则需要由WMS隐式创建WindowToken
3)WindowState的创建和相关处理,将WindowToken和WindowState相关联
4)创建和配置DisplayContent,完成窗口添加到系统前的准备工作
*Window的删除过程*
要删除Window需要先调用WindowManagerImpl的removeView方法,在removeView方法中又会调用WindowManagerGlobal的removeView方法
主要是以下4件事
1)检查删除线程的正确性,如果不正确就抛出异常(因为只有创建Window的原始线程才能够操作Window)
2)从ViewRootImpl列表、布局参数列表和View列表中删除与Window对应的元素
3)判断是否可以直接执行删除操作,如果不能就推迟删除操作(比如Window正在运行一个动画)
4)执行删除操作,清理和释放与Window相关的一切资源
欢迎关注我的微信公众号:安卓圈