WMS
WindowManagerService服务的实现是相当复杂的,它要管理的整个系统所有窗口的UI,而在任何一个系统中,窗口管理子系统都是极其复杂的。
主要功能
- Surface管理。为所有窗口分配Surface,客户端向WMS添加一个窗口的过程,其实就是WMS为其分配一块Suiface的过程,一块块Surface在WMS的管理下有序的排布在屏幕上。Window的本质就是Surface。
- 管理窗口的显示顺序、尺寸、位置, 最终都会反馈SurfaceFlinger。
- 窗口动画, 包括进入,退出动画
-
输入系统中转站:WMS是派发系统按键和触摸消息的最佳人选,当接收到一个触摸事件,它需要寻找一个最合适的窗口来处理消息,而WMS是窗口的管理者,系统中所有的窗口状态和信息都在其掌握之中,完成这一工作不在话下。
什么是Window
“Window”表明它是和窗口相关的,“窗口”是一个抽象的概念,从用户的角度来讲,它是一个“界面”;从SurfaceFlinger的角度来看,它是一个Layer,承载着和界面有关的数据和属性;从WMS角度来看,它是一个WIndowState,用于管理和界面有关的状态。
在《深入理解Android内核设计思想》一书中看到一个比喻非常好,整个界面就像由N个演员参与的话剧:SurfaceFling是摄像机,它只负责客观的捕捉当前的画面,然后真实的呈现给观众;WMS就是导演,它要负责话剧的舞台效果、演员站位;ViewRoot就是各个演员的长相和表情,取决于它们各自的条件与努力。可见,WMS与SurfaceFling的一个重要区别就是——后者只做与“显示”相关的事情,而WMS要处理对输入事件的派发。
WMS框架
Activity, AMS,WMS,IMS关系
Activity,Window,View,WMS关系
Activity,AMS, WMS数据结构关系
WMS简单类图
WMS稍微完整类图
WMS启动流程
Activity添加Window流程
Activity创建Surface流程
WMS图层z-order计算过程
参考博客,其他相关流程
Activity添加Window流程
Activity创建Surface流程
窗口大小和位置(X轴和Y轴)的计算过程
窗口Z轴位置的计算和调整过程
Android Token在APP,AMS,WMS之间传递