一、WindowManagerService 类
- 核心地位与职责概述
- WindowManagerService 类是 WMS 的主要实现类,就像整个窗口管理系统的大脑,处于绝对的核心地位。它承担着窗口管理的诸多关键职责,包括窗口的创建、管理和销毁等一系列核心功能。
- 它就像是一个繁忙的交通指挥中心,接收来自各个应用程序的请求,然后有条不紊地指挥各个组件协同工作,确保窗口能够正常地显示和操作。
- 与其他组件的交互关系
- 和客户端应用程序:通过 Binder 机制接收应用程序发送的请求。例如,当应用程序想要创建一个新窗口时,会通过 WindowManager 接口向 WMS 发送请求,这个请求最终会到达 WindowManagerService 类进行处理。
- 和 WindowState 类:在创建窗口时,会为每个窗口创建一个 WindowState 实例,用于跟踪和管理窗口的各种状态信息。它和 WindowState 类紧密协作,通过调用 WindowState 的方法来实现对窗口状态的更新,如窗口位置、大小的改变等。
- 和 SurfaceFlinger:通过创建 SurfaceControl 对象与 SurfaceFlinger 进行交互。在窗口显示过程中,它将 SurfaceControl 提交给 SurfaceFlinger,使得窗口能够在屏幕上显示出来。而且,当窗口属性发生变化需要更新显示时,它也会通知 SurfaceFlinger 进行重新绘制。
- 关键方法解析
- addView 方法:这是创建窗口的关键方法之一。当 AMS(Activity Manager Service)需要创建一个新的 Activity 窗口或者应用程序通过 WindowManager 请求添加一个视图窗口时,会调用这个方法。它首先会进行权限验证,然后创建 WindowState 和 SurfaceControl 等相关对象,完成窗口的创建和添加流程。例如,在应用程序启动一个新的 Activity 时,系统会通过这个方法为 Activity 创建窗口并添加到系统的窗口管理体系中。
- removeView 方法:用于销毁窗口。当应用程序结束或者窗口不再需要时,会调用这个方法。它会释放与窗口相关的各种资源,包括 Surface 资源,更新窗口状态,并从 DisplayContent 中移除窗口相关信息。例如,在 Activity 的 onDestroy 方法中,就会触发这个方法来销毁窗口。
- updateViewLayout 方法:当窗口的布局信息(如位置、大小等属性)发生变化时,应用程序会通过这个方法向 WMS 发送更新请求。它会获取对应的 WindowState 对象,更新其布局相关的字段,并根据需要调整窗口在层级树中的位置,最后通知 SurfaceFlinger 重新绘制窗口,以实现窗口布局的更新。
二、WindowState 类
- 状态信息存储与管理角色
- WindowState 类主要负责存储和管理窗口的各种状态信息,是窗口在 WMS 中的 “代言人”。它记录了窗口的属性,如位置(通过 x 和 y 坐标)、大小(width 和 height)、透明度等,就像是一个窗口的信息档案库。
- 除了基本属性,它还跟踪窗口的生命周期,从创建、显示、隐藏到销毁的各个阶段,都有相应的状态记录和处理机制。例如,它可以知道一个窗口当前是处于显示状态还是隐藏状态,以便在需要的时候正确地处理窗口的显示和隐藏操作。
- 树形结构组织方式及其优势
- WindowState 采用树形结构组织,每个 WindowState 实例都有一个指向父节点的引用,形成了一个层次化的窗口容器树。这种结构就像是一个家族族谱,清晰地展现了窗口之间的层级关系。
- 这种树形结构的优势在于,它允许 WMS 有效地管理复杂的窗口层级关系。例如,在多窗口场景下,通过这种结构可以很容易地确定窗口的显示顺序,确保正确的绘制顺序和事件分发。当有新窗口添加或者窗口层级发生变化时,WMS 可以通过这个树形结构快速地调整窗口的位置和顺序。
- 接口实现与功能扩展
- 它继承自 WindowContainer,实现了 WindowManagerPolicy.WindowState 接口。这种设计将窗口管理的策略和实际实现分离,提高了系统的灵活性和可扩展性。
- 通过实现这些接口,WindowState 能够更好地与 WMS 的其他组件协作,实现各种复杂的功能。例如,它实现的接口方法可以用于接收和处理来自 WMS 的各种命令,如更新窗口状态、处理动画等,同时也为外部组件提供了统一的访问窗口状态的方式。
- 输入事件分发与窗口动画协调职责
- 在输入事件分发方面,WindowState 扮演着重要的角色。它接收并转发输入事件到对应的窗口。当用户在屏幕上进行触摸或者按键操作时,WMS 会根据窗口的层级和位置等信息,将事件发送到对应的 WindowState,然后由它将事件分发给窗口进行处理。
- 在窗口动画协调方面,它负责处理窗口过渡动画,如淡入淡出、滑动等。例如,当窗口需要显示或者隐藏时,WindowState 会根据预先定义的动画规则,协调窗口的动画效果,使得窗口的显示和隐藏过程更加平滑和自然。
三、WindowToken 类
- 窗口身份标识的重要性
- WindowToken 类主要用于标识窗口所属于的应用程序或任务,就像是窗口的 “身份证”。在 Android 系统中,有众多的窗口,为了区分它们所属的应用程序或者任务,就需要一个唯一的标识,这就是 WindowToken 的重要作用。
- 它确保了窗口身份的唯一性和安全性,防止不同应用程序或者任务的窗口之间出现混淆或者非法访问的情况。例如,在多任务环境下,不同应用程序的窗口可以通过 WindowToken 进行区分,WMS 可以根据 WindowToken 来判断窗口所属的应用程序,从而进行正确的管理和资源分配。
- 创建时机与关联机制
- 对于系统窗口(如输入法窗口),通常需要主动创建 WindowToken。这一般是由特定的服务(如 InputMethodManagerService)来完成。在创建窗口时,WMS 会为其生成一个 WindowToken,并将其与窗口相关联。
- WindowState 通过引用 WindowToken 来识别和管理窗口。这种关联机制就像是把窗口和它的 “身份证” 绑定在一起,使得 WMS 在管理窗口时可以方便地通过 WindowToken 来查找和操作对应的窗口。例如,当需要对某个应用程序的所有窗口进行统一操作(如隐藏或者显示)时,WMS 可以通过 WindowToken 快速定位到这些窗口。
四、Surface 类
- 图形绘制底层支持功能
- Surface 类是用于绘制图形内容的底层对象,是窗口显示内容的基础。它就像是一块无形的画布,为窗口提供了绘制图形的场所。每个窗口都有一个对应的 Surface,窗口通过在 Surface 上绘制内容来实现显示。
- 它提供了一系列的方法和接口,供应用程序进行图形绘制和渲染。例如,应用程序可以使用 Surface 提供的绘图 API 来绘制文本、图像、图形等各种元素,从而构建出丰富多彩的用户界面。
- 与 WMS 和其他组件的协同工作方式
- 在 WMS 的工作流程中,Surface 与其他组件密切协作。当 WMS 为窗口创建 SurfaceControl 对象后,SurfaceControl 会管理 Surface 的显示层级和属性,然后将 Surface 提交给 SurfaceFlinger 进行显示。
- 在窗口的更新过程中,例如当窗口的内容发生变化需要重新绘制时,WMS 会通过 Surface 相关的机制,通知 SurfaceFlinger 重新绘制 Surface,以确保窗口显示的内容能够及时更新。而且,在窗口的生命周期管理中,当窗口销毁时,相关的 Surface 资源也会被释放,避免资源浪费。