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