之前已经分析过 锁屏的结构 ,今天具体分析一下power键上锁流程。
1、锁屏相关的主要几个类:
SystemUI\src\com\android\systemui\keyguard\KeyguardViewMediator.java 等等,也就是流程图顶部一行显示的类。
其中:
KeyguardViewMediator是大脑,控制着整个锁屏;
KeyguardService 负责Keyguard模块与PWM和PMS的沟通;
KeyguardUpdateMonitor 负责将锁屏等的状态变化传递下去;
StatusBarKeyguardViewManager 负责View管理;
KeyguardBouncer 专门负责Bouncer界面的管理。
这里重点说一下KeyguardViewMediator 和 KeyguardUpdateMonitor的作用:
KeyguardViewMediator是整个待机解/锁屏业务的调度器,负责调度锁屏界面的相关动作及查询解锁屏状态,
可以进行的调度操作包括:
1) 响应PowerManagerService对KeyguardService的调度(通过PhoneWindowManager);
2) 实施真正的锁屏doKeyguardLocked()与解锁keyguardDone(boolean);
3) 响应SIM卡状态变化并对锁屏界面做相应的调整onSimStateChanged();
4) 调度待机锁屏UI界面的管理,包括显示handleShow ()、隐藏handleHide ()、重置handleReset ()、等,提供状态查询接口,比如:isSecure(),isHiding(),KeyguardViewMediator实现这部分调度是通过持有mStatusBarKeyguardViewManager来实现的。
另外,Keyguard相关的api可能会被其他的线程调用,比如InputManagerService和windowManagerService。因此在keyguardViewMediator的方法是同步的,并且任何一个和Keyguard画面相关的事件都投掷到Handler中以确保在UI线程中处理。
KeyguardUpdateMonitor是所有会影响整个待机解/锁屏业务的事件的监控器。(除了作为监控器,它还发挥着类似上下文的作用,也许我们应该把这个类命名为(KeyguardContext)。它监控诸如时间改变、电池状态改变、时区改变、SIM卡状态变化、电话状态变化、电话信号变化等事件。它是一个观察者模式的被观察对象。观察者通过调用KeyguardUpdateMonitor的registerInfoCallback(InfoCallback)和registerSimStateCallback(SimStateCallback)方法进行注册,观察自己感兴趣的变化。KeyguardUpdateMonitor的观察者包括KeyguardViewMediator、LockScreen、PatternUnlockScreen、AccountUnlockScreen、PasswordUnlockScreen、SimUnlockScreen等。观察者通过调用KeyguardUpdateMonitor的removeCallback(Object)取消观察。
2、锁屏界面布局结构:
锁屏界面跟解锁后的状态栏是共用的布局。尤其是通知栏和QS部分,是完全共用的。都包含在StatusBarWindowView中。
Bouncer的界面比较特殊,是动态创建并添加到StatusBarWindowView中的。
布局结构如下图:
Bouncer根据SecurityMode会呈现不同的界面,一般有5种。Pattern、PIN、Password、SimPIN、SimPUK(都实现了KeyguardSecurityView)。