likes
comments
collection
share

WMS之WindowContainer窗口框架简介

作者站长头像
站长
· 阅读数 10

Android的知识体系搭建

WMS系列

一 概述

WMS 的复杂程度不下于 AMS,甚至由于从 Android 10 开始,谷歌为了支持分屏显示,小窗模式,全面屏手势等原因,现在网上对 WMS 的资料与最新的 Android 系统有了非常大的出入,所以在介绍 WMS 之前,我们有必要了解一下在最新的 Android 系统中,WMS 整体的框架。

从 Android 10 开始,谷歌对 WMS 框架进行了大改,现在网上经常看到的 ActivityStack,在 Android 12 中已经被删除。

二 Android 窗口框架

如下图,就是 WMS 整体框架的继承关系,最上层的类是 WindowContainer,当然,在 WindowContainer 之上还有一个接口 ConfigurationContainer,我们简单了解即可,现在我们从 WindowContainer 开始依次介绍。

WMS之WindowContainer窗口框架简介

2.1 ConfigurationContainer

首先就是 ConfigurationContainer,它是一个接口没有什么好说的,定义了一些函数让子类的重写。

[frameworks/base/services/core/java/com/android/server/wm/ConfigurationContainer.java]
public abstract class ConfigurationContainer<E extends ConfigurationContainer> {

2.2 WindowContainer

[frameworks/base/services/core/java/com/android/server/wm/WindowContainer.java]
class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<E>
        implements Comparable<WindowContainer>, Animatable, SurfaceFreezer.Freezable {

WindowContainer 是 ConfigurationContainer 的子类,官方的介绍是为可以直接保存窗口或通过层次结构形式的其子级保存窗口的类定义通用功能。

说人话就是,WindowContainer 是 Android 窗口管理系统中的基类,它表示窗口系统中的通用容器。 也就是说,其他所有的窗口,都是它的子类。它定义了窗口容器的常见行为。

2.3 RootWindowContainer

[frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java]
class RootWindowContainer extends WindowContainer<DisplayContent> implements DisplayManager.DisplayListener

RootWindowContainer 是 WindowContainer 的子类之一,一句话概括,就是它是设备的根容器。

详细的说,它是窗口最顶部的容器,Android 会以树形结构的方式,向 RootWindowContainer 中添加其他窗口,它是窗口的根。

RootWindowContainer 提供的功能有:Activity,Dialog 等 UI,动画,输入事件,焦点,可见性等等

2.4 Task

[frameworks/base/services/core/java/com/android/server/wm/Task.java]
class Task extends WindowContainer<WindowContainer> 

如果看过之前关于 AMS 的内容,那么就应该对 Task 很熟悉了,简单来说,Task 可以理解为 Activity 的栈。所以对于每一个 Activity 都对应着一个 Task,但是对于每个 Task,它可以对应多个 Activity

Task 对于 Activity 有着如下几个作用:窗口管理(大小,状态,可见性),生命周期管理,最近使用的屏幕等

2.5 ActivityRecord

ActivityRecord 就是 Android 系统中 Activity 的实例了,它里面保存了 Activity 所有的信息。

2.6 WindowToken

[frameworks/base/services/core/java/com/android/server/wm/WindowToken.java]
class WindowToken extends WindowContainer<WindowState> {

关于 WindowToken,官方的定义如下:

WindowManager 中一组相关的窗口容器。通常这是一个 AppWindowToken, 它是用来显示窗口的 Activity 的句柄。对于嵌套窗口,有一个为父窗口创建的 WindowToken 来管理其子窗口。

说人话就是,WindowToken 将一个应用的窗口组合到了一起,不管你是 Activity,还是输入法或是其他的窗口,都属于同一个 WindowToken,那么你们就会放在同一个窗口中,具体的显示逻辑,会根据你这个窗口的 ZOrder 进行排序。而 WindowToken 名字中的 Token 这个字段,表示了它的唯一性,之前我们讲 ActivityRecord 中的 Token 保证了 Activity 的唯一性,ActivityRecord 中的 Token 就是继承自 WindowToken 的,而 ActivityRecord 中的那个 token 变量,其实就是父类 WindowToken 中的。

还有一点,最最最重要的,就是为什么你可以将 Activity,DIalog,Toast 显示在手机上,就是因为这个 WindowToken,只有 WindowToken 合法,系统才会将你的窗口显示在设备上。

2.7 WindowState

[frameworks/base/services/core/java/com/android/server/wm/WindowState.java]
class WindowState extends WindowContainer<WindowState> implements WindowManagerPolicy.WindowState,
        InsetsControlTarget {

WindowState 类表示窗口的当前状态。

详细的说,WindowState 里保存了窗口的各个属性,例如其大小、位置和可见性。

2.8 WallpaperWindowToken

[frameworks/base/services/core/java/com/android/server/wm/WallpaperWindowToken.java]
class WallpaperWindowToken extends WindowToken {

WallpaperWindowToken 是一种特殊类型的窗口令牌,用于管理壁纸窗口。

2.9 DisplayArea

[frameworks/base/services/core/java/com/android/server/wm/DisplayArea.java]
public class DisplayArea<T extends WindowContainer> extends WindowContainer<T> {

DisplayArea 表示显示器上的一个虚拟区域,可以在其中组织和管理窗口。用于将 WindowContainer 分组到 DisplayContent 下的容器,并根据它们的类型对它们进行排序。 DisplayAreas 由 DisplayAreaPolicy 管理, 显示区域可以嵌套。

DisplayAreas 有三种类型,以确保窗口具有正确的 Z 顺序:

  • BELOW_TASKS:只能包含位于 Task 下方的 DisplayAreas 和 WindowTokens。
  • ABOVE_TASKS:只能包含位于 Task 之上的 DisplayAreas 和 WindowTokens。
  • ANY:可以包含任何类型的 DisplayArea,以及任何类型的 WindowToken 或 Task 容器。

2.10 DisplayArea .Dimmable

DisplayArea.Dimmable 表示可以变暗的容器,可以用于亮度调节。

2.11 DisplayArea.Token

DisplayArea.Token 是表示与 DisplayArea 关联的 Token,是 WindowToken 类的子类,DisplayArea.Token 用于唯一标识和管理特定 DisplayArea 的状态。

2.12 RootDisplayArea

RootDisplayArea 表示窗口管理系统中显示区域的根容器。

2.13 DisplayAreaGroup

DisplayAreaGroup 表示窗口管理系统中的一组显示区域。

2.14 DisplayContent

DisplayContent 表示显示器对应的内容和属性。 它负责管理特定显示器的窗口和策略。

三 窗口

WindowManagerPolicy

WindowManagerPolicy 是 Android 窗口管理系统中的一个接口,它定义了管理窗口、处理输入事件以及与系统 UI 交互的策略和行为。

WindowManagerPolicy 接口只有一个实现类就是 PhoneWindowManager。

WindowManagerPolicy 的一些主要职责包括:

WindowManagerPolicy 主要定义了窗口管理的策略,例如

  • 窗口在屏幕上的布局和位置
  • 输入事件的处理与分发
  • 窗口的焦点变更处理
  • 管理系统UI的策略,例如状态栏和导航栏

WindowManagerPolicy 接口被设计为平台无关的,并且目前 WindowManagerPolicy 只有一个子类,就是 PhoneWindowManager。

WMS 系统涉及的内容较多,后续会继续补充。