支持连接的显示器

连接的显示器将桌面窗口化体验扩展到标准手机,让用户能够通过移动设备访问大屏幕。此功能为应用互动和用户生产力开辟了新的可能性。

桌面窗口化的所有独特功能都适用于连接的显示器。当您将手机连接到显示器时,手机的状态保持不变,并在连接的显示器上启动一个空白桌面会话。设备和显示器充当两个独立的系统,每个显示器都有自己的特定应用。

图 1. 手机连接到外部显示器,显示器上有一个桌面会话,而手机保持自己的状态。

如果您将支持桌面窗口化的设备(例如平板电脑)连接到外部显示器,桌面会话将扩展到两个显示器上。这样,两个显示器便可作为一个连续系统运行。此设置允许窗口、内容和光标在两个显示器之间自由移动。

图 2. 平板电脑连接到外部显示器,将桌面会话扩展到两个显示器上。

有效支持连接的显示器需要注意应用设计和实现中的多个方面。以下最佳实践可确保流畅且高效的用户体验。

处理动态显示器更改

许多应用都是在假定 Display 对象及其特性在应用生命周期内不会更改的情况下构建的。但是,当用户连接或断开外部显示器,甚至在显示器之间移动应用窗口时,与您的应用上下文或窗口关联的底层 Display 对象可能会更改。显示器的属性(例如尺寸、分辨率、刷新率、HDR 支持和密度)都可能不同。例如,如果您根据手机屏幕硬编码值,您的布局很可能会在外部显示器上出现问题。

外部显示器还可能具有截然不同的像素密度。您需要确保您的应用正确响应密度更改。这包括对布局使用密度无关像素 (dp)、提供特定于密度的资源,并确保您的 UI 适当缩放。

使用正确的上下文

在多显示器环境中,使用正确的上下文至关重要。访问资源时,Activity 上下文(已显示)与应用上下文(未显示)不同。

Activity 上下文包含有关显示器的信息,并且始终针对 Activity 出现的显示区域进行调整。这使您能够获取有关应用显示密度或窗口指标的正确信息。始终使用 Activity 上下文(或另一个基于 UI 的上下文)来获取有关当前窗口或显示器的信息。这也会影响一些使用上下文信息的系统 API。

获取显示信息

您可以使用 Display 类获取有关特定显示器的信息,例如其尺寸或指示显示器是否安全的标志。要获取可用显示器,请使用 DisplayManager 系统服务

val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
val displays = displayManager.getDisplays()

管理 Activity 启动和配置

通过连接的显示器,应用可以指定应用在启动时或创建另一个 Activity 时应在哪个显示器上运行。此行为取决于清单文件中定义的 Activity 启动模式以及启动 Activity 的实体设置的 intent 标志和选项。

当 Activity 移动到辅助显示器时,您的应用可能会经历上下文更新、窗口大小调整以及配置和资源更改。如果 Activity 处理配置更改,它会在 onConfigurationChanged() 中收到通知。否则,Activity 将重新启动。

如果 Activity 的选定启动模式允许多个实例,则在辅助屏幕上启动可能会创建 Activity 的新实例。两个 Activity 会同时恢复,这对于某些多任务处理场景可能很有用。

您可以使用 ActivityOptions 在特定显示器上启动 Activity

val options = ActivityOptions.makeBasic()
options.setLaunchDisplayId(targetDisplay.displayId)
startActivity(intent, options.toBundle())

避免设备白名单

应用有时会通过白名单或检查内置显示器尺寸来限制大型屏幕 UI 和功能,使其仅适用于选定的设备。对于连接的显示器,这种方法不再有效,因为几乎任何新设备都可以连接到大屏幕。设计您的应用以响应并适应各种屏幕尺寸和密度。

支持外部外设

当用户连接到外部显示器时,他们通常会创建更像桌面的环境。这通常涉及使用外部键盘、鼠标、触控板、网络摄像头、麦克风和扬声器。您需要确保您的应用与这些外设无缝协作。这包括处理键盘快捷键、管理鼠标指针互动、正确支持外部摄像头或麦克风以及尊重音频输出路由。有关更多详细信息,请参阅大屏幕上的输入兼容性

提高用户生产力

连接的显示器为提高用户生产力提供了重要机会。您现在拥有构建可提供与桌面应用程序媲美体验的移动应用的工具。考虑实施以下功能以提高用户生产力

  • 允许用户打开同一应用的多个实例。这对于比较文档、管理不同对话或同时查看多个文件等任务非常宝贵。
  • 通过拖放功能,使用户能够与您的应用共享富数据。
  • 通过实施稳健的状态管理系统,帮助用户在配置更改时保持工作流程。

通过遵循这些指南并利用所提供的代码示例,您可以创建能够无缝适应连接显示器的应用,为用户提供更丰富、更高效的体验。