前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >理解WindowManagerService

理解WindowManagerService

作者头像
用户3112896
发布2019-09-26 15:16:40
1K0
发布2019-09-26 15:16:40
举报
文章被收录于专栏:安卓圈

*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,创建的过程在android.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线程才会被唤醒从而继续执行下面的代码(PWM-PulseWidthModulation脉冲宽度调制)

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相关的一切资源

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 安卓圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档