支持桌面窗口模式

桌面窗口模式让用户能够同时在可调整大小的应用窗口中运行多个应用,从而提供多功能、类似桌面的体验。

在图 1 中,您可以看到启用桌面窗口模式后屏幕的组织方式。请注意以下几点:

  • 用户可以同时并排运行多个应用。
  • 任务栏固定在显示屏底部,显示正在运行的应用。用户可以固定应用以进行快速访问。
  • 新的可自定义标题栏装饰着每个窗口的顶部,带有最小化和最大化等控件。
图 1. 平板电脑上的桌面窗口模式。

默认情况下,应用在 Android 平板电脑上全屏打开。要以桌面窗口模式启动应用,请按住屏幕顶部的窗口手柄并将手柄拖动到 UI 内部,如图 2 所示。

当一个应用以桌面窗口模式打开时,其他应用也会以桌面窗口模式打开。

图 2. 按住并拖动应用窗口手柄以进入桌面窗口模式。

用户也可以通过轻触或点击窗口手柄时显示在窗口手柄下方的菜单,或使用键盘快捷键 Meta 键(Windows、Command 或 Search)+ Ctrl + Down 来调用桌面窗口模式。

用户通过关闭所有活动窗口或抓住桌面窗口顶部的窗口手柄并将应用拖动到屏幕顶部来退出桌面窗口模式。Meta + H 键盘快捷键也会退出桌面窗口模式并再次全屏运行应用。

要返回桌面窗口模式,请轻触或点击“最近使用”屏幕中的桌面空间磁贴。

可调整大小和兼容模式

在桌面窗口模式下,方向锁定的应用可以自由调整大小。这意味着即使某个 activity 锁定为纵向,用户仍然可以调整应用大小以适应横向窗口。

图 3. 将纵向限制应用的窗口调整为横向。

声明为不可调整大小(即 resizeableActivity = false)的应用会在保持相同宽高比的情况下缩放其 UI。

图 4. 不可调整大小的应用 UI 会随窗口大小调整而缩放。

锁定方向或声明为不可调整大小的相机应用对其相机取景器有特殊处理:窗口可完全调整大小,但取景器保持相同的宽高比。由于假定应用始终在纵向或横向运行,应用会硬编码或以其他方式做出假设,导致预览或捕获图像的方向或宽高比计算错误,从而导致图像拉伸、侧向或颠倒。

在应用准备好实现完全响应式相机取景器之前,特殊处理提供了一种更基本的用户体验,可以减轻错误假设可能导致的影响。

要了解有关相机应用兼容模式的更多信息,请参阅设备兼容模式

图 5. 调整窗口大小时,相机取景器保持其宽高比。

可自定义的标题栏内边距

所有在桌面窗口模式下运行的应用都有一个标题栏,即使在沉浸模式下也是如此。
确保您的应用内容不会被标题栏遮挡。标题栏是一种标题栏内边距类型:androidx.compose.foundation.layout.WindowInsets.Companion.captionBar();在视图中为 WindowInsets.Type.captionBar(),它是系统栏的一部分。

您可以在在您的应用中全屏显示内容并在 Compose 中处理窗口内边距中了解有关处理内边距的更多信息。

标题栏也是可自定义的。Android 15 引入了外观类型 APPEARANCE_TRANSPARENT_CAPTION_BAR_BACKGROUND,使标题栏透明,允许应用在标题栏内部绘制自定义内容。

然后,应用负责设置其内容顶部的样式,使其看起来像标题栏(背景、自定义内容等),但系统标题元素(关闭和最大化按钮)除外,这些元素由系统在应用上方的透明标题栏上绘制。

应用可以使用 APPEARANCE_LIGHT_CAPTION_BARS 在浅色和深色主题之间切换标题栏内部系统元素的显示,类似于状态栏和导航栏的切换方式。

Android 15 还引入了 WindowInsets#getBoundingRects() 方法,该方法使应用能够更详细地检查标题栏内边距。应用可以区分系统绘制系统元素的区域和应用可以在不与系统元素重叠的情况下放置自定义内容的未利用区域。

API 返回的 Rect 对象列表指示应避免的系统区域。任何剩余空间(通过从标题栏内边距中减去矩形计算得出)是应用可以在不与系统元素重叠的情况下绘制并能够接收输入的地方。

Chrome before and after implementing custom headers.
图 6. Chrome 在实现自定义标题前后的对比。

多任务和多实例支持

多任务是桌面窗口模式的核心,允许多个应用实例可以极大地提高用户的工作效率。

Android 15 引入了 PROPERTY_SUPPORTS_MULTI_INSTANCE_SYSTEM_UI,应用可以设置此属性来指定应为应用显示系统 UI,以允许其作为多个实例启动。

通过拖动手势管理应用实例

在多窗口模式下,用户可以通过将视图元素拖出应用窗口来启动新的应用实例。用户还可以在同一应用的不同实例之间移动元素。

图 7. 通过将 Chrome 桌面窗口中的标签页拖出以启动 Chrome 的新实例。

Android 15 引入了两个标志来定制拖放行为

图 8. 在 Chrome 应用的两个实例之间移动标签页。

其他优化

自定义应用启动并将应用从桌面窗口模式转换为全屏。

指定默认大小和位置

并非所有应用,即使是可调整大小的应用,都需要一个大窗口才能提供用户价值。您可以使用 ActivityOptions#setLaunchBounds() 方法在 activity 启动时指定默认大小和位置。

从桌面空间进入全屏

应用可以通过调用 Activity#requestFullScreenMode() 进入全屏模式。此方法可直接从桌面窗口模式全屏显示应用。