窗口添加后,其大小和位置并非一成不变。每当窗口属性变化、输入法弹出或屏幕旋转时,都会触发 relayoutWindow。
1. 什么是 Relayout?
relayout 是 WMS 及其客户端(应用进程)最频繁的交互点。它主要完成:
- 尺寸计算:WMS 根据屏幕大小、Insets(状态栏等占位)计算窗口的最终 Frame。
- 配置同步:将最新的
Configuration(如横竖屏、语言)同步给应用。 - Surface 状态变更:控制 Surface 的显示、隐藏或尺寸调整。
2. 核心算法:窗口框架 (Frame) 计算
| 框架术语 | 含义描述 |
|---|---|
| parentFrame | 父容器(如 Display 或包含它的 Task)给出的参考范围。 |
| displayFrame | 窗口在当前屏幕中的可用范围。 |
| contentFrame | 扣除状态栏、导航栏等装饰后,真正用于显示内容的范围。 |
| finalFrame | 经过 WMS 策略计算后,窗口最终在屏幕上的物理坐标。 |
3. Insets 机制(现代 Android 重点)
现代 Android 不再简单地减去状态栏高度,而是使用 WindowInsets 机制。WMS 负责计算这些 Insets(如键盘、手势区域)并将其分发给 View 系统,从而实现沉浸式状态栏或避让输入法。