目录
Android之WindowManagerService介绍](https://www.jianshu.com/p/a9f66ab8b82e)
WindowManagerService
WMS是系统服务,主要负责窗口的一下管理,主要包括如下:
- 窗口管理
- 窗口动画
- 输入系统的中转站
- Surface管理
”可以毫不夸张的说,Android的framework层主要是由WMS、AMS还有View所构成,这三个模块穿插交互在整个framework中,掌握了它们之间的关系和每一个逻辑步骤,你对framework的了解至少有百分之五十”。这是《Android源码与设计模式》作者的原话。
一个App从启动到主窗口显示出来,需要App,ActivityManagerService(AMS),WindowManagerService(WMS),SurfaceFlinger(SF)等几个模块相互合作。App负责业务逻辑,绘制自己的视图;AMS管理组件、进程信息和Activity的堆栈及状态等等;WMS管理Activity对应的窗口及子窗口,还有系统窗口等;SF用于管理图形缓冲区,将App绘制的东西合成渲染在屏幕上。
android窗口
在android的应用框架中,窗口主要分为两种:
- 应用窗口
activity有一个主窗口,弹出的对话框也有一个窗口,Menu菜单也是一个窗口。
应用窗口表示类是PhoneWindow和Window。
PhoneWindow继承于Window,针对手机屏幕做了一些优化工作。
PhoneWindow只是一个窗口封装类,里面核心的是mDecorView这个变量,mDecorView是一个顶层的View。 - 公共界面的窗口
最近运行对话框、关机对话框、状态栏下拉栏、锁屏界面等。
这些窗口都是系统级别的窗口,不从属于任何应用,和activity没有任何关系。
这种窗口没有任何窗口类来封装,直接调用WindowManager.addView()来把一个view添加到WindowManager中。
WindowManagerService的重要成员
名字 | 含义 |
---|---|
mPolicy:WindowManagerPolicy | 是窗口管理策略的接口类,用来定义一个窗口策略所要遵循的通用规范,并提供了WindowManager所有的特定的UI行为 |
mSessions:ArraySet | 主要用于进程间通信,其他的应用程序进程想要和WMS进程进行通信就需要经过Session,并且每个应用程序进程都会对应一个Session |
mWindowMap:WindowHashMap | 用来保存WMS中各种窗口的集合 |
mFinishedStarting:ArrayList | 用于存储已经完成启动的应用程序窗口(比如Activity)的AppWindowToken的列表 |
mResizingWindows:ArrayList | 用来存储正在调整大小的窗口的列表 |
mAnimator:WindowAnimator | 用于管理窗口的动画以及特效动画 |
mH:H | 用来将任务加入到主线程的消息队列中 |
mInputManager:InputManagerService | 输入系统的管理者 |
Window的添加过程
WindowToken可以理解为窗口令牌,且会将一个组件(比如同一个Activity)的窗口(WindowState)集合在一起,方便管理
主要是以下4件事
- 对所要添加的窗口进行检查,如果窗口不满足一些条件,就不会再执行下面的代码逻辑
- WindowToken相关的处理,比如有的窗口类型需要提供WindowToken,没有提供的话就不会执行下面的代码逻辑,有的窗口类型则需要由WMS隐式创建WindowToken
- WindowState的创建和相关处理,将WindowToken和WindowState相关联
- 创建和配置DisplayContent,完成窗口添加到系统前的准备工作
Window的删除过程
要删除Window需要先调用WindowManagerImpl的removeView方法,在removeView方法中又会调用WindowManagerGlobal的removeView方法
主要是以下4件事
- 检查删除线程的正确性,如果不正确就抛出异常(因为只有创建Window的原始线程才能够操作Window)
- 从ViewRootImpl列表、布局参数列表和View列表中删除与Window对应的元素
- 判断是否可以直接执行删除操作,如果不能就推迟删除操作(比如Window正在运行一个动画)
- 执行删除操作,清理和释放与Window相关的一切资源