AOSP 默认实现的锁屏(带有用于解锁它的功能(keyguard))仅显示在主显示屏上。在 Android 9(及更低版本)中,辅助屏幕在一个外部显示屏上支持单个锁定窗口。在 Android 10 中,锁屏扩展到所有公共辅助显示屏。锁屏仍然很简单,并且不支持从辅助屏幕解锁。
图 1. 辅助显示屏上的锁屏
设备制造商可以为辅助显示屏实现其锁屏界面,前提是满足基本的安全要求。当设备锁定时,所有显示屏上的信息都应被安全地隐藏。对于设备锁定时应显示或隐藏哪些内容,没有内置的策略或控制。因此,实现受限访问的唯一安全方法是将所有内容隐藏在锁屏界面和锁定窗口之后。唯一的例外是明确选择使用 R.attr.showWhenLocked
或 Activity.setShowWhenLocked()
方法选择在锁屏界面顶部显示的应用。否则,公共和私有显示屏都有泄露信息的强大可能性。
虽然显示屏可以置于不同的状态(ON
/OFF
),但锁定状态对于所有显示屏都是全局的。与任何设备实现一样,设备何时锁定(或解锁)对于用户来说应该是显而易见的。例如,按下电源按钮通常会锁定移动设备。电源按钮也应锁定所有内部和外部屏幕。
因为锁定窗口由 SystemUI 拥有,所以它不会放置在私有显示屏上。私有显示屏的所有者负责在设备锁定时隐藏窗口和保护内容。默认系统实现仅通过更改可见性来隐藏私有显示屏上的活动。
实现
辅助显示屏上的锁定窗口在 KeyguardDisplayManager
中被实现为 Presentation 窗口。Android 10 将 KeyguardDisplayManager#mPresentations
更改为一个数组,该数组保存所有辅助屏幕的所有锁定窗口。KeyguardDisplayManager
还有一个显示屏更改监听器,用于响应可用显示屏的更改并保护所有屏幕。重要的是在任何给定时间立即锁定所有连接的显示屏,以便攻击者即使可以物理访问设备也无法提取用户数据。
锁定窗口显示在所有公共辅助显示屏上(参见 KeyguardDisplayManager#isKeyguardShowable()
)。私有显示屏的所有者负责在设备锁定时保护内容。