首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android之WindowManagerService介绍

Android之WindowManagerService介绍

作者头像
李小白是一只喵
发布2021-04-23 11:18:18
发布2021-04-23 11:18:18
1.2K0
举报
文章被收录于专栏:算法微时光算法微时光

image.png

目录

Android之WindowManagerService介绍](https://cloud.tencent.com/developer/article/1816992)

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
  • WindowManagerService
  • android窗口
  • WindowManagerService的重要成员
  • Window的添加过程
  • Window的删除过程
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档