美文网首页
Android之WindowManagerService介绍

Android之WindowManagerService介绍

作者: Lee_5566 | 来源:发表于2021-04-20 13:39 被阅读0次
image.png

目录

Android之WindowManagerService介绍](https://www.jianshu.com/p/a9f66ab8b82e)

WindowManagerService

WMS是系统服务,主要负责窗口的一下管理,主要包括如下:

  • 窗口管理
  • 窗口动画
  • 输入系统的中转站
  • Surface管理

”可以毫不夸张的说,Android的framework层主要是由WMS、AMS还有View所构成,这三个模块穿插交互在整个framework中,掌握了它们之间的关系和每一个逻辑步骤,你对framework的了解至少有百分之五十”。这是《Android源码与设计模式》作者的原话。

image.png

一个App从启动到主窗口显示出来,需要App,ActivityManagerService(AMS),WindowManagerService(WMS),SurfaceFlinger(SF)等几个模块相互合作。App负责业务逻辑,绘制自己的视图;AMS管理组件、进程信息和Activity的堆栈及状态等等;WMS管理Activity对应的窗口及子窗口,还有系统窗口等;SF用于管理图形缓冲区,将App绘制的东西合成渲染在屏幕上。

image.png

android窗口

在android的应用框架中,窗口主要分为两种:

  1. 应用窗口
    activity有一个主窗口,弹出的对话框也有一个窗口,Menu菜单也是一个窗口。
    应用窗口表示类是PhoneWindow和Window。
    PhoneWindow继承于Window,针对手机屏幕做了一些优化工作。
    PhoneWindow只是一个窗口封装类,里面核心的是mDecorView这个变量,mDecorView是一个顶层的View。
  2. 公共界面的窗口
    最近运行对话框、关机对话框、状态栏下拉栏、锁屏界面等。
    这些窗口都是系统级别的窗口,不从属于任何应用,和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件事

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

相关文章

网友评论

      本文标题:Android之WindowManagerService介绍

      本文链接:https://www.haomeiwen.com/subject/ehdjlltx.html