自由窗口:Freeform 如何组织与交互
2026/8/9大约 3 分钟大屏/折叠屏/自由窗口Android 14Freeform自由窗口多窗口
自由窗口:Freeform 如何组织与交互
上一章建立了全景。这一章回答:自由窗口(Freeform)是什么,窗口如何拖动、缩放与 层级管理,和分屏有什么不同?
Freeform 是独立窗口模式
| 常见误解 | 正确理解 |
|---|---|
| Freeform 就是“缩小版全屏” | 它有独立的窗口装饰、拖动与缩放语义,像桌面窗口 |
| Freeform 窗口也是分屏 | 分屏固定布局,Freeform 可自由移动与调整大小 |
| 所有设备都默认支持 Freeform | 通常在大屏/桌面场景启用,手机默认不开启 |
核心结论
- Freeform 是独立窗口模式,窗口可移动、可缩放。
- 窗口由 Task/WindowOrganizer 组织,进入/退出有明确语义。
- 拖动与缩放由 WMS 与系统 UI 协作完成。
- 应用需要声明可调整大小,否则可能以固定尺寸显示。
- 与分屏不同,Freeform 更接近桌面窗口模型。
Freeform 主链
逐步解释:
- 进入:系统或用户把应用切到 Freeform。
- 模式:windowing mode 切换并通知应用。
- 组织:窗口进入 Task 并由装饰层支持。
- 交互:拖动/缩放更新窗口 bounds。
- 响应:Configuration 变化,应用重新布局。
Freeform 与分屏的差异
| 维度 | 分屏 | Freeform |
|---|---|---|
| 布局 | 固定分区 | 自由位置与大小 |
| 交互 | 拖分隔线 | 拖动/缩放窗口 |
| 组织 | Root Task 分区 | 独立 Task |
| 适用 | 大部分多任务 | 大屏/桌面 |
应用若未适配自由尺寸,建议在自由窗口下验证布局与输入。
源码证据
阅读目标:确认 Freeform 的窗口模式定义。
正文指针:WindowConfiguration.java 的 WINDOWING_MODE_FREEFORM; WindowOrganizer.java 的任务组织入口。
// WindowConfiguration.java(伪代码,行号以 r75 为准)
public static final int WINDOWING_MODE_FREEFORM = 5;这段代码证明: Freeform 是独立窗口模式;WMS 按该模式管理窗口 bounds 与交互, 应用通过 Configuration 感知变化。
验证与排障
环境:开发设备或模拟器;自由窗口需要设备/系统支持。
adb shell dumpsys activity activities | grep -iE "windowingMode|freeform"
adb shell dumpsys window windows | grep -iE "Window #|freeform"
adb shell settings put global enable_freeform_support 1先确认系统是否支持自由窗口,再看窗口的 windowingMode 与 bounds。Freeform 布局错乱 时,检查应用是否响应 Configuration 与尺寸变化。
常见误区
- “Freeform = 分屏”:不同窗口模式。
- “手机默认支持 Freeform”:通常大屏/桌面才启用。
- “窗口拖动是应用实现”:由 WMS 与系统 UI 协作。
- “Freeform 窗口必须全屏适配”:应按自由尺寸适配。
延伸问题
- Freeform 窗口如何进入与退出,规则是什么?
- 最小窗口尺寸由谁决定?
- Freeform 与 Taskbar 如何协作?
- 厂商如何自定义 Freeform 交互?
源码入口
| 文件 | 关键位置 | 作用 |
|---|---|---|
WindowConfiguration.java | FREEFORM 模式 | 形态定义 |
WindowOrganizer.java | 任务组织 | 窗口管理 |
WindowManagerService.java | bounds 管理 | 拖动缩放 |
dumpsys activity | windowingMode | 排障入口 |
公共路径:frameworks/base/core/java/android/app/ 与 frameworks/base/services/core/java/com/android/server/wm/。行号以 r75 检索为准。
多个自由窗口如何组成桌面体验,见 桌面模式。