当前位置: 首页 > news >正文

Android Framework 之WMS详解

1.WMS说的就是 WindowManagerService:负责为Activity对应的窗口分配Surface,管理Surface的显示顺序以及位置尺寸,控制窗口动画 。 它是Android系统中为各个客户端即每个app来提供这样的服务的一个类。
在Android系统中在systemServer 进程和各个应用进程之间是采用Client/Server架构,也就是大家最常听到的C/S架构,熟悉Android系统启动流程的应该知道Ams,WMS等这些系统服务都是在systemServer进程创建后启动的,以便后续为各个应用提供服务,我们来思索一个本质问题,像这里的每一个系统服务和各个应用之间其实是一对多的关系,这种关系适合它的架构就是c/s 架构
。就扩展到这,我们回到WMS的讨论上来,整个cs流程如下图,但是服务器那侧的流程是简化版不够详细:
在这里插入图片描述简述整个流程就是当Activity.onResume()被调用之后,客户端会与WMS进行通信将我们的布局显示在屏幕上。其中主要涉及以下几个过程:
客户端通知WMS创建一个窗口,并添加到WindowToken。即addToDisplayAsUser阶段。
客户端通知WMS创建Surface,并计算窗口尺寸大小。即relayoutWindow阶段。
客户端获取到WMS计算的窗口大小后,进一步测量该窗口下View的宽度和高度。即performMeasure阶段。
客户端确定该窗口下View的尺寸和位置。即performLayout阶段。
确定好View的尺寸大小位置之后,便对View进行绘制。即performDraw阶段。
通知WMS,客户端已经完成绘制。WMS进行系统窗口的状态刷新以及动画处理,并最终将Surface显示出来。即reportDrawFinished阶段

2.而服务侧 WMS内部详细的流程图如下:
在这里插入图片描述其中的角色我们一一来介绍一下:
WindowState:和客户端窗口一一对应,在向WMS添加一个窗口时,WMS会为其创建一个WindowState,来表示窗口的所有属性,WindowState相当于属性窗口管理(比如对外提供操作接口,属于层级结构中最底部的容器),窗口画面相关都剥离给了WindowStateAnimator,WindowState也是WMS中事实上的窗口。
WindowStateAnimator:主要用于管理WindowState相关画面surface,通过mDrawState参数来描述Surface所处的状态。
WindowToken:保存了所有具有同一个token的WindowState,将属于同一个activity的窗口组织在一起,activity在需要更新窗口时,必须向WMS提供WindowToken以表名自己的身份,并且窗口的类型必须与所持有的的WindowToken类型一致。
补充:一个WindowToken可以对应多个WindowState。 WindowToken是一个用于表示窗口层次结构中的窗口的标识符。每个Window具有一个与之关联的WindowToken,它用于帮助系统管理窗口的显示和交互。
一个WindowToken可以有多个WindowState表示与之相关的窗口。这是因为在Android系统中,可能会存在一些特殊情况,例如PopupWindow、Dialog等,它们属于同一个WindowToken,但是显示在不同的窗口上。
因此,一个WindowToken可以与多个WindowState关联,这样可以实现多个窗口的操作和管理。
WindowSurfaceController:用来创建SurfaceControl。
DisplayContent:即代表的是单个屏幕。隶属于同一个DisplayContent的窗口将会被显示在同一个屏幕中。每个DisplayContent都对应着一个唯一的id,在添加窗口时可以通过指定这个ID决定将其显示在哪个屏幕中。
WindowSurfacePlacer:整个窗口层次结构刷新的入口。
RootWindowContainer:是窗口容器的顶层容器,其直接管理DisplayContent。

3.第三个介绍的是窗口移除从App端发起,当Activity执行destroy(),即以handleDestroyActivity()为起点,执行wm.removeViewImmediate()开启;
通过WindowManagerGlobal–>ViewRootImpl–>Session–>WindowManagerService的removeWindow(),调用到WindowState的removeIfPossible()–>removeImmediately(),接着调用到WindowStateAnimator的destroySurfaceLocked()–>destroySurface(),逐步调用改变绘制状态为NO_SURFACE–>WindowSurfaceController的destroy()最终调用到SurfaceControl的remove()来通知SurfaceFlinger来移除layer;

后续有时间再进行更详细的细节分析。

http://www.lryc.cn/news/413679.html

相关文章:

  • opencv-图像仿射变换
  • 算法的基本概念
  • 124. Go Template应用实例:用代码生成代码
  • 【AI实践】阿里云方言文本转语音TTS
  • java 之 各类日期格式转换
  • Nvidia黄仁勋对话Meta扎克伯格:AI和下一代计算平台的未来 | SIGGRAPH 2024对谈回顾
  • 【JAVA设计模式】适配器模式——类适配器模式详解与案例分析
  • 【Vue】全局组件和局部组件
  • react引入高德地图并初始化卫星地图
  • 2024最简七步完成 将本地项目提交到github仓库方法
  • 前端WebSocket入门,看这篇就够啦!!
  • 漏洞复现-F6-11泛微-E-Cology-SQL
  • Turbo Boost 禁用
  • 假期BUUCTF小练习3
  • 【ubuntu系统】在虚拟机内安装Ubuntu
  • Python初学者必须掌握的基础知识点
  • ESP32是什么?
  • jemalloc分析内存
  • 【QT】qss
  • Java处理大数据的技巧
  • JavaScript基础——JavaScript常见语句(判断语句、循环语句、控制流语句)
  • 材质球向shader传值失败
  • 【TDH社区版大事件】图分析、全文检索、小文件治理、数据开发工具通通都有!
  • 【反序列化漏洞】serial靶机详解
  • C#列表按照日期进行从大到小排序
  • rt-thread每个线程状态切换方法
  • visual studio跳转到上一个/下一个光标处的快捷键设置
  • 网络基础命令配置复习 (基础华为设备)
  • 在AspNetCoreRateLimit中,ClientRateLimiting 和 IpRateLimiting 都有的时候按谁的来
  • PEP 8 – Python 代码风格指南中文版(五)