Android系统中,WindowManager(以下简称WMS)负责一切窗口的管理,窗口可以理解为屏幕上的各种显示区域,如状态栏、Activity、锁屏…对于WMS来说,都是一个具体的窗口实例。从这篇文章开始,将会对WindowManager模块进行整理总结。
1.WMS架构
在WindowManager中,以容器+树结构的形式对窗口进行管理,最顶层容器为ConfigurationContainer,它是所有容器的父容器,各个容器继承关系如下:
上图中包含了WMS中的所有容器,各个子容器含义如下:
- ConfigurationContainer:最顶层容器,定义了多个Configuration对象,以及提供了用来组织各容器层级的公共逻辑;
- WindowProcessController:用于和AMS中的ProcessRecord进行通讯,当ProcessRecord中对应用进程作出调整后,通过WindowProcessController和WM进行通信;
- WindowContainer:作为可以保存窗口类父类,定义了用于操作窗口的所有公共方法;
- RootWindowContainer:窗口容器在树结构中的根节点;
- DisplayContent:作为RootWindowContainer的子节点,用于管理同一个逻辑屏的窗口;
- DisplayChildWindowContainer:DisplayContent中的所有子节点的父类;
- NonAppWindowContainers:继承于DisplayChildWindowContainer,主要保存非来自应用的WindowToken;
- WindowContainers:只包含一个子节点——DisplayArea.Root,大部门窗口都会保存在这个容器中;
- DisplayArea:用于对DisplayContent中的节点进行分组管理,主要分为了三类;
- Root:DisplayArea的子类,该容器作为DisplayContent中最顶层的显示区域,用来保存Tokens、TaskDisplayArea、ImeContainer容器;
- TaskDisplayArea:DisplayArea的子类,此类容器用于管理Task;
- Tokens:DisplayArea的子类,该容器用来保存正常窗口的WindowToken;
- ImeContainer:Tokens的子类,该容器用来保存IME窗口的WindowToken;
- Task:用来保存ActivityRecord,即我们常说的"任务";
- ActivityStack:Task的子类,用来管理处于同一个栈的Activity,特殊栈可以保存Task;
- WindowToken:用来管理窗口,多个窗口可以被一个WindowToken进行管理;
- ActivityRecord:继承于WindowToken,表示Activit