快速了解WMS机制
WMS是什么
- 开发中各种UI显示异常的bug都可以在WMS体系中找到对应的解决办法和对应原理。
- 因为WMS管理着所有的窗口,包括创建、删除和修改,以及将某个窗口设置为焦点窗口。
- WMS(WindowManagerService)相关概念
- Window:它是一个抽象类,具体实现类为 PhoneWindow ,它对 View 进行管理。Window是View的容器,View是Window的具体表现内容;
- WindowManager:是一个接口类,继承自接口 ViewManager ,从它的名称就知道它是用来管理 Window 的,它的实现类为 WindowManagerImpl;
- WMS:是窗口的管理者,它负责窗口的启动、添加和删除。另外窗口的大小和层级也是由它进行管理的;
应用于那些场景
- Activity页面渲染
- Activity 启动后就可以看到我们写的 Layout 布局界面,Activity 从 setContentView() 加载布局到Window上,这个过程就涉及到WMS。
- Dialog弹窗渲染
- 创建Dialog后,会去创建Window窗口,然后通过addView形式将视图添加到窗口上。这个过程就涉及到WMS。
- 可以解决那些问题
- 如果你的定位是做界面开发,那么界面怎么来的?如何显示的?如何布局?如何渲染……要明白这些问题,WMS就是你必须掌握的内容。
WMS主要功能
-
主要功能
- Surface管理。为所有窗口分配Surface,客户端向WMS添加一个窗口的过程,其实就是WMS为其分配一块Surface的过程,一块块Surface在WMS的管理下有序的排布在屏幕上。Window的本质就是Surface。
- 管理窗口的显示顺序、尺寸、位置, 最终都会反馈SurfaceFlinger。
- 窗口动画, 包括进入,退出动画
- 输入系统中转站:WMS是派发系统按键和触摸消息的最佳人选,当接收到一个触摸事件,它需要寻找一个最合适的窗口来处理消息,而WMS是窗口的管理者,系统中所有的窗口状态和信息都在其掌握之中,完成这一工作不在话下。
-
主要功能图
Window是什么
- Window是什么?
- 表示一个窗口的概念,是所有View的直接管理者,任何视图都通过Window呈现(点击事件由Window->DecorView->View; Activity的setContentView底层通过Window完成)
- Window是一个抽象类,具体实现是PhoneWindow。这个可以看Activity#attach方法源码
- 创建Window需要通过WindowManager创建,WindowManager是外界访问Window的入口,Window具体实现位于WindowManagerS