Z-order 是 window manager 的一个重要机制,z-order 决定多个窗口在屏幕中 z 轴的上下关系。如果一个窗口 A 的 z-order 比另一个窗口 B 大,则窗口 A 会覆盖窗口 B。
该文档中,我们会介绍目前已有的 z-order 机制,同时基于我们的业务场景,探讨我们的 z-order 机制该如何设计。
Android 窗口有属性 type,而 type 决定窗口的 z-order。例如,壁纸的 z-order 比应用窗口小,状态栏的 z-order 比应用窗口大。Type 是在新建窗口时由客户端设置的参数,因此,客户端可以决定想要的 z-order。
对于同一个 type 的窗口,新显示的窗口的 z-order 更高。
Android 为了避免三方应用显示一个 z-order 很大的窗口来覆盖其他窗口,对 type 的使用做了权限检查。
对于应用窗口(Activity),它们使用同一个 type。基于移动平台小屏幕环境下,Android 针对应用窗口的策略是同一时刻只有一个应用窗口显示(暂不考虑非全屏、分屏等)。该策略由 ActivityManager 驱动(现在是 ActivityTaskManager)。
应用窗口保存在一个叫 Task 的栈中,当启动一个应用窗口时,它会移动到栈顶,然后隐藏栈中其他应用窗口。
因为同一时刻只有一个应用窗口显示,所以切换应用窗口时系统可以执行应用窗口的切换动画(显示新窗口和隐藏旧窗口)。