android 之 KeyguardService
一、功能定位与核心作用
KeyguardService 是 Android 锁屏功能的核心服务,负责管理设备锁屏界面(如密码、图案、指纹等验证流程),并协调系统安全策略与用户交互。主要职责包括:
- 锁屏状态管理
- 控制锁屏界面的显示/隐藏,处理设备休眠(
onStartedGoingToSleep
)与唤醒(onFinishedWakingUp
)事件。 - 响应电源键操作,确保亮屏时立即显示锁屏界面。
- 控制锁屏界面的显示/隐藏,处理设备休眠(
- 安全验证机制
- 支持多种解锁方式(密码、PIN、图案、指纹、人脸识别等),通过
KeyguardSecurityContainer
管理验证逻辑。 - 集成生物识别(如指纹)监听,通过
KeyguardUpdateMonitor
处理传感器事件。
- 支持多种解锁方式(密码、PIN、图案、指纹、人脸识别等),通过
- 隐私与安全增强
- 隐藏敏感通知内容(如消息预览),防止锁屏状态下信息泄露。
- 限制连续错误尝试(例如多次输错密码后临时锁定设备)。
二、系统架构与关键组件
1. 核心类与交互关系
类名 | 职责 | 调用关系 |
---|---|---|
KeyguardService | 服务入口,通过 IKeyguardService.Stub 提供 Binder 接口供系统进程调用 | 被 SystemServer 启动 |
KeyguardViewMediator | 协调锁屏状态转换,处理系统事件(如休眠/唤醒) | 持有 KeyguardUpdateMonitor |
KeyguardUpdateMonitor | 监听系统状态变化(电量、SIM卡、生物识别等)并通知注册的回调 | 被 KeyguardViewMediator 依赖 |
KeyguardBouncer | 管理解锁界面的显示逻辑(如滑动解锁、密码输入框) | 由 StatusBarKeyguardViewManager 调用 |
2. 服务启动流程
关键点:
- KeyguardService 作为 SystemUI 的一部分,由
SystemServer
在启动阶段通过startSystemUi()
触发。- 通过
KeyguardServiceWrapper
实现跨进程通信(系统进程 → SystemUI 进程)。
三、事件处理机制
1. 电源事件响应
- 灭屏流程:
onStartedGoingToSleep()
→onScreenTurningOff()
→ 重置锁屏界面 →onScreenTurnedOff()
。 - 亮屏流程:
onStartedWakingUp()
→onScreenTurningOn()
→ 显示锁屏 →onScreenTurnedOn()
。
2. 生物识别集成
- 指纹解锁流程通过
KeyguardUpdateMonitor
监听传感器事件:
当指纹验证成功时触发解锁。// 示例:指纹认证回调 mUpdateMonitor.registerFingerprintCallback(new FingerprintStateCallback() {@Overridepublic void onFingerprintAuthenticated() {dismissKeyguard(); // 解锁设备} });
四、开发接口
通过 KeyguardManager
系统服务,开发者可进行以下操作:
- 检查锁屏状态
KeyguardManager kgm = (KeyguardManager) getSystemService(KEYGUARD_SERVICE); boolean isLocked = kgm.isKeyguardLocked(); // 设备是否处于锁屏状态
- 请求临时解锁
kgm.requestDismissKeyguard(activity, callback); // 弹出系统对话框请求用户解锁
- 禁用/启用锁屏
KeyguardManager.KeyguardLock lock = kgm.newKeyguardLock("TAG"); lock.disableKeyguard(); // 临时禁用(如播放视频时) lock.reenableKeyguard(); // 重新启用
- AOSP 源码
KeyguardService
:frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard
KeyguardManager
:frameworks/base/core/java/android/app/KeyguardManager.java