ANDROID的KEYGUARD相关类提供了屏幕锁屏等相关功能,虽然功能简单,但是相关的逻辑还是挺复杂的,要处理屏幕处于不同状态的情况,要监控各种事件(时间,电池,Sim状态,电话状态),因此GOOGLE还是对屏幕功能进行了细致的设计,架构上采用了中介模式、MVC模式等设计模式。系统类图如下:
PhoneWindowManager、PowerManager、KeyguardViewMediator、KeyguardUpdateMonitor、KeyguardViewManager、KeyguardViewHost、LockPatternKeyguardView、KeyguardScreen相关类之间构成中介模式,KeyguardViewMediator对象处于模式的核心,起到中介者的角色,其它对象都通过KeyguardViewMediator对象相互交互。
KeyguardViewMediator对象是PhoneWindowManager成员,因此PhoneWindowManage可以直接访问KeyguardViewMediator对象。KeyguardViewMediator也通过PowerManager服务创建了三个不计数WakeLock锁实现与PowerManager服务的通讯,达到锁屏操作时电源状态管理的目的(mWakeLock锁用于保证在 keyguard显示时能够显示一段时间后屏幕才能睡眠;mShowKeyguardWakeLock用于在 keyguard显示要打开时能够保持设备唤醒;mWakeAndHandOff由PhoneWindowManager截获事件进行触发,用于在用户按键或鼠标移动时唤醒设备便于对keyguard进行操作)。KeyguardUpdateMonitor、KeyguardViewManager对象作为KeyguardViewMediator对象的成员又都是由KeyguardViewMediator实例化的,KeyguardViewMediator可以直接操作KeyguardUpdateMonitor、KeyguardViewManager对象。
而KeyguardViewHost、LockPatternKeyguardView作为视图对象通过调用KeyguardViewManager对象的show函数创建并作为视图添加到窗口上, KeyguardViewHost作为窗口得主视图, LockPatternKeyguardView是KeyguardViewHost的子视图。KeyguardScreen类是各类锁屏、解锁屏幕的接口,各类锁屏、解锁屏幕都是KeyguardScreen类的视图实现类,在调用LockPatternKeyguardView的updateScreen函数时根据不同的模式作为LockPatternKeyguardView的子视图添加到LockPatternKeyguardView视图上显示。
KeyguardUpdateMonitor、KeyguardViewHost、LockPatternKeyguardView、KeyguardScreen接口的对象都通过回调与KeyguardViewMediator反向调用。
KeyguardUpdateMonitor 类实现时间,电池,Sim状态,电话状态的监视,KeyguardViewMediator类是KeyguardUpdateMonitor类内部回调接口InfoCallback、SimStateCallbac的实现类,因此KeyguardViewMediator对象可以作为KeyguardUpdateMonitor对象的回调对象,通过KeyguardUpdateMonitor的registerInfoCallback和registerSimStateCallback函数把KeyguardViewMedia