借助桌面窗口功能,用户可以在可调整大小的应用窗口中同时运行多个应用,从而获得类似桌面的多样化体验。
在图 1 中,您可以看到启用桌面窗口化的屏幕的组织方式。需注意的事项:
用户可以同时并排运行多个应用。
任务栏位于显示屏底部的固定位置,用于显示正在运行的应用。用户可以将应用固定到任务栏,以便快速访问。
新的可自定义标题栏会在每个窗口顶部添加最小化和最大化等控件。
图 1. 平板电脑上的桌面窗口。
默认情况下,应用在 Android 平板电脑上会全屏打开。如需在桌面窗口中启动应用,请按住屏幕顶部的窗口手柄,然后在界面中拖动手柄,如图 2 所示。
当应用在桌面窗口化模式下打开时,其他应用也会在桌面窗口中打开。
您的浏览器不支持视频标记。
图 2. 按住并拖动应用窗口手柄即可进入桌面窗口模式。
用户还可以通过点按或点击窗口手柄或使用键盘快捷键 Meta 键(Windows、Command 或 Search)+ Ctrl + 向下键,从窗口手柄下方显示的菜单中调用桌面窗口功能。
用户通过以下方式退出桌面窗口:关闭所有活动窗口,或抓住桌面窗口顶部的窗口手柄并将应用拖动到屏幕顶部。Meta + H 键盘快捷键也可以退出桌面窗口化模式,并再次全屏运行应用。
如需返回桌面窗口,请点按或点击“最近使用的应用”屏幕中的桌面空间功能块。
注意: 从 Android 15 QPR1 开始,桌面窗口功能作为 Pixel Tablet(和模拟器)的开发者预览版提供。其他高端平板电脑和可折叠手机预计将在后续版本中支持此功能。
可调整大小和兼容模式
在桌面窗口化模式下,锁定屏幕方向的应用可自由调整大小。这意味着,即使某个 activity 锁定为纵向,用户仍可以将应用调整为横向窗口。
您的浏览器不支持视频标记。
图 3. 将仅限纵向的应用的窗口大小调整为横向。
声明为不可调整大小(即 resizeableActivity = false)的应用会缩放界面,同时保持相同的宽高比。
您的浏览器不支持视频标记。
图 4. 不可调整大小的应用的界面会随着窗口大小的调整而缩放。
锁定屏幕方向或声明为不可调整大小的相机应用会对相机取景器进行特殊处理:窗口完全可调整大小,但取景器会保持相同的宽高比。通过假设应用始终在竖屏或横屏下运行,应用会对预览或所拍摄图片的方向或宽高比进行硬编码或做出其他假设,从而导致图片发生拉伸、侧向或上下颠倒。
在应用准备好实现完全响应的相机取景器之前,特殊处理可提供更基本的用户体验,从而减轻错误假设可能造成的影响。
如需详细了解相机应用的兼容性模式,请参阅设备兼容性模式。
您的浏览器不支持视频标记。
图 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 对象列表指示应避免的系统区域。任何剩余空间(通过从标题栏内边距中减去矩形计算得出)都是应用可以绘制且不会与系统元素重叠且能够接收输入的位置。
图 6. 实现自定义标头之前和之后的 Chrome。
注意: 默认情况下,系统会处理标题栏区域内的输入,以处理其自己的元素(例如关闭按钮)或启动桌面窗口的拖动操作。自定义应用标题的应用可以使用 setSystemGestureExclusionRects() API 请求在可自定义区域内为其应用界面请求优先输入处理。
多任务处理和多实例支持
多任务处理是桌面窗口化的核心,允许应用多个实例可以极大地提高用户的工作效率。
Android 15 引入了 PROPERTY_SUPPORTS_MULTI_INSTANCE_SYSTEM_UI,应用可以设置此属性,以指定应为应用显示系统界面,以允许其以多个实例启动。
注意: 在桌面窗口化和其他多窗口环境中,新任务会在新窗口中打开,因此每当您的应用启动多个任务时,请仔细检查用户历程。
使用拖动手势管理应用实例
在多窗口模式下,用户可以通过将视图元素从应用窗口中拖出来启动新的应用实例。用户还可以在同一应用的实例之间移动元素。
您的浏览器不支持视频标记。
图 7. 将标签页从桌面窗口中拖出,启动一个新的 Chrome 实例。
Android 15 引入了两个标志来自定义拖放行为:
DRAG_FLAG_START_INTENT_SENDER_ON_UNHANDLED_DRAG:表示如果没有可见窗口处理放下操作,则应将未处理的拖动操作委托给系统来启动。
使用此标志时,调用方必须为 ClipData 提供 Item,后者包含要启动的 activity 的不可变 IntentSender(请参阅 ClipData.Item.Builder#setIntentSender())。系统可以根据当前屏幕尺寸或窗口模式等因素启动或不启动 intent。如果系统未启动 intent,可以通过正常的拖放流程取消 intent。
DRAG_FLAG_GLOBAL_SAME_APPLICATION:表示拖动操作可以跨窗口边界(适用于同一应用的多个实例)。
设置此标志后,调用 startDragAndDrop() 时,只有属于同一应用的可见窗口才能参与拖动操作并接收拖动的内容。
您的浏览器不支持视频标记。
图 8. 在 Chrome 应用的两个实例之间移动标签页。
其他优化
自定义应用启动,以及将应用从桌面窗口切换到全屏。
指定默认大小和位置
并非所有应用(即使可调整大小)都需要大窗口来为用户提供价值。您可以使用 ActivityOptions#setLaunchBounds() 方法指定 activity 启动时的默认大小和位置。
从桌面空间进入全屏模式
应用可以通过调用 Activity#requestFullScreenMode() 进入全屏模式。该方法会直接从桌面窗口全屏显示应用。