外观
DMS、WMS 和虚拟显示有什么关系?多屏页面由谁管?
标准回答
DMS 是 DisplayManagerService,负责显示设备相关管理,包括物理显示和虚拟显示的发现、配置与状态变化。可以把 DMS 理解为管理“有哪些屏幕及其属性”,WMS 管这些显示区域中的窗口,ATMS 则管理页面和任务的安排。
多屏启动时,应用可能通过 ActivityOptions 指定目标 displayId,但这只是启动选项,还需要满足显示存在、调用方有权访问、Activity 和系统支持相应模式等条件。系统最终根据能力和策略处理。displayId、taskId、userId 分别表示显示、任务与用户,不能互相替代。
虚拟显示是系统创建的逻辑显示目标,输出可以送到指定 Surface,供录制、编码、投送或其他场景消费,不要求背后一定有一块物理屏。它可以用于镜像或独立内容等不同配置,因此虚拟显示不等于只能录屏,也不等于天然自带完整桌面。
排查多屏问题时,我会先确认显示是否存在且配置正确,再看任务和窗口实际在哪个 display、哪个用户下,以及输入设备或事件关联到了哪里。画面到了副屏但触摸仍送到主屏,属于显示与输入目标不一致,不能只修改布局尺寸解决。
关键机制
- DMS 管显示设备与配置;ATMS / WMS 协调页面、任务和窗口在显示区域中的行为。
- 虚拟显示的输出由 Surface 等路径交给消费者,访问与内容受相应权限和策略约束。
- 多屏核对 displayId、taskId、userId、窗口和输入目标,不只看“启动成功”日志。
通俗例子
把一个页面移到副屏后,返回行为异常:先看它所在任务的返回栈、目标显示的 Home 支持与焦点,再分析 Back 的实际处理;不是只要给虚拟显示发一个 HOME Intent,就能获得完整桌面能力。
追问与回答
虚拟显示一定有 Launcher 吗?
没有这个保证。是否支持 Home 和系统装饰取决于显示的属性、系统策略与相应配置,还要有合适的 Home 实现。单纯创建一个 VirtualDisplay 只是创建显示目标,不会自动把手机主屏的完整桌面环境复制过去。需要分别验证页面启动、系统装饰和输入支持。
为什么设置了 launchDisplayId,页面还是没按预期出现在副屏?
我会先确认副屏仍有效且调用者可访问,再核对系统是否支持相关多显示能力,目标 Activity 的条件以及任务复用带来的影响。同时看最终 Task 和 Window 的实际 displayId,而不是只看传入参数。必要时读取系统拒绝或重定向的原因,不能假设一个选项能强制覆盖全部策略。
易混淆点
虚拟显示不保证自动启动 Launcher、显示状态栏或具备独立输入。系统装饰、Home、可信显示与权限条件等都可能影响能力,具体看目标系统配置。
参考资料
内容来源
- Android 技术札记 · 原条目
dms-basics