Android的KEYGUARD相关类提供了屏幕锁屏等相关功能,虽然功能简单,可是相关的逻辑仍是挺复杂的,要处理屏幕处于不一样状态的状况,要监控各类事件(时间,电池,Sim状态,电话状态),所以GOOGLE仍是对屏幕功能进行了细致的设计,架构上采用了中介模式、MVC模式等设计模式。系统类图以下:java
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视图上显示。app
KeyguardUpdateMonitor、KeyguardViewHost、LockPatternKeyguardView、KeyguardScreen接口的对象都经过回调与KeyguardViewMediator反向调用。函数
KeyguardUpdateMonitor 类实现时间,电池,Sim状态,电话状态的监视,KeyguardViewMediator类是KeyguardUpdateMonitor类内部回调接口InfoCallback、SimStateCallbac的实现类,所以KeyguardViewMediator对象能够做为KeyguardUpdateMonitor对象的回调对象,经过KeyguardUpdateMonitor的registerInfoCallback和registerSimStateCallback函数把KeyguardViewMediator对象添加到KeyguardUpdateMonitor对象的回调对象列表中,当KeyguardViewMediator对象检测到时间,电池,Sim状态,电话状态变化时经过回调调用KeyguardViewMediator对象的相关接口。oop
KeyguardViewMediator类也是KeyguardViewCallback接口的实现,所以在KeyguardViewManager实例化时KeyguardViewMediator对象也做为KeyguardViewCallback类型的参数传进KeyguardViewManager做为KeyguardViewManager的内部成员mCallback。而后mCallback又做为参数在KeyguardViewHost对象实例化时传进去做为KeyguardViewHost对象的成员,并经过LockPatternKeyguardView的函数setCallback设置LockPatternKeyguardView对象的回调对象,所以KeyguardViewHost、LockPatternKeyguardView均可以经过KeyguardViewCallback类型的回调对象与KeyguardViewMediator对象通信。this
LockPatternKeyguardView对象建立了六个实现了KeyguardScreen接口的各个锁屏、解锁屏幕对象,LockScreen用于显示屏幕加锁状态,另外根据不一样的unlockMode模式建立了不一样的解锁屏幕:PatternUnlockScreen实现图案解锁模式,SimPukUnlockScreen屏幕实现SIM PUK码解锁模式,SimUnlockScreen实现 Sim PIN码解锁模式,AccountUnlockScreen实现 GOOGLE账户解锁,PasswordUnlockScreen实现口令解锁模式。spa
每一个锁屏、解锁屏幕对象在建立时都传进去一个实现了KeyguardScreenCallback接口的回调对象mKeyguardScreenCallback(LockPatternKeyguardView的一个成员),KeyguardScreenCallback接口派生自KeyguardViewCallback接口。在mKeyguardScreenCallback回调对象中实现了KeyguardViewCallback类型的回调对象mCallback的包装(装饰模式的采用),所以各个锁屏、解锁屏幕对象能够经过KeyguardScreenCallback接口与KeyguardViewMediator对象通信。.net
另外KeyguardUpdateMonitor、KeyguardViewManager、LockPatternKeyguardView、KeyguardScreen类还构成了MVC模式。KeyguardUpdateMonitor实现了MVC模式中的模式角色,用来提供模式状态数据。KeyguardViewManager担当MVC模式中的控制器角色,经过KeyguardViewManager生成视图,生成和控制视图的表现。LockPatternKeyguardView、KeyguardScreen接口类对象担当视图角色,模式能够直接向视图传送状态(经过把LockPatternKeyguardView和锁屏、解锁屏幕的内部对象做为回调对象登记到KeyguardUpdateMonitor对象的回调对象列表中),视图也能够直接读取KeyguardUpdateMonitor模式的状态数据,所以LockPatternKeyguardView、KeyguardScree类对象视图中都有一个KeyguardUpdateMonitor对象的引用。线程
LockPatternKeyguardView对象由LockPatternKeyguardViewProperties对象采用了工厂方法进行实例化。
各个对象的实例化代码片段:
PhoneWindowManager对象WindowManagerService.java中实例化,并在WindowManagerService的PolicyThread线程运行时初始化。
[java] view plain copy
final WindowManagerPolicy mPolicy = PolicyManager.makeNewWindowManager(); public PolicyThread(WindowManagerPolicy policy, WindowManagerService service, Context context, PowerManagerService pm) { super("WindowManagerPolicy"); mPolicy = policy; mService = service; mContext = context; mPM = pm; } public void run() { Looper.prepare(); mPolicy.init(mContext, mService, mService, mPM); synchronized (this) { } Looper.loop(); } }
在PhoneWindowManager对象init函数调用时实例化KeyguardMediator对象
[java] view plain copy
- public void init(Context context, IWindowManager windowManager,
- WindowManagerFuncs windowManagerFuncs,
- LocalPowerManager powerManager) {
- …
- mKeyguardMediator = new KeyguardViewMediator(context, this, powerManager);
- }
KeyguardViewMediator构造函数中实例化PowerManager的三个锁及KeyguardUpdateMonitor、LockPatternKeyguardViewProperties、KeyguardViewManager对象。
[java] view plain copy
- public KeyguardViewMediator(Context context, PhoneWindowManager callback,
- LocalPowerManager powerManager) {
- mPM = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
- mWakeLock = mPM.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "keyguard");
- mWakeLock.setReferenceCounted(false);
- mShowKeyguardWakeLock=mPM.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "show keyguard");
- mShowKeyguardWakeLock.setReferenceCounted(false);
- mWakeAndHandOff = mPM.newWakeLock(
- PowerManager.PARTIAL_WAKE_LOCK,
- "keyguardWakeAndHandOff");
- mWakeAndHandOff.setReferenceCounted(false);
- mUpdateMonitor = new KeyguardUpdateMonitor(context);
- mUpdateMonitor.registerInfoCallback(this);
- mUpdateMonitor.registerSimStateCallback(this);、
- mKeyguardViewProperties=new LockPatternKeyguardViewProperties(mLockPatternUtils, mUpdateMonitor);
- mKeyguardViewManager = new KeyguardViewManager(
- context, WindowManagerImpl.getDefault(), this,
- mKeyguardViewProperties, mUpdateMonitor);
- }
在KeyguardViewManager的show中实例化KeyguardViewHost、LockPatternKeyguardView对象。
[java] view plain copy
- public synchronized void show() {
- if (mKeyguardHost == null) {
- mKeyguardHost = new KeyguardViewHost(mContext, mCallback);
- WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
- stretch, stretch, WindowManager.LayoutParams.TYPE_KEYGUARD,
- flags, PixelFormat.TRANSLUCENT);
- mViewManager.addView(mKeyguardHost, lp);
- }
- if (mKeyguardView == null) {
- mKeyguardView = mKeyguardViewProperties.createKeyguardView(mContext, mUpdateMonitor, this);
- mKeyguardView.setCallback(mCallback);
- final ViewGroup.LayoutParams lp = new FrameLayout.LayoutParams(
- ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.MATCH_PARENT);
- mKeyguardHost.addView(mKeyguardView, lp);
- }
在LockPatternKeyguardView的createLockScreen和createUnlockScreenFor函数中建立加锁和解锁屏幕。
[java] view plain copy