开封网站建设哪家好,wordpress企业站主题免费,制作网页网站的软件是,网站模板类型1.WMS说的就是 WindowManagerService#xff1a;负责为Activity对应的窗口分配Surface#xff0c;管理Surface的显示顺序以及位置尺寸#xff0c;控制窗口动画 。 它是Android系统中为各个客户端即每个app来提供这样的服务的一个类。 在Android系统中在systemServer 进程和各…1.WMS说的就是 WindowManagerService负责为Activity对应的窗口分配Surface管理Surface的显示顺序以及位置尺寸控制窗口动画 。 它是Android系统中为各个客户端即每个app来提供这样的服务的一个类。 在Android系统中在systemServer 进程和各个应用进程之间是采用Client/Server架构也就是大家最常听到的C/S架构熟悉Android系统启动流程的应该知道AmsWMS等这些系统服务都是在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相当于属性窗口管理比如对外提供操作接口属于层级结构中最底部的容器窗口画面相关都剥离给了WindowStateAnimatorWindowState也是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
后续有时间再进行更详细的细节分析。