Keyguard类图
Keyguard有四种解锁界面
PatternUnlockScreen.java类 图案开锁界面
SimUnlockScreen.java 类 PIN开锁界面
PasswordUnlockScreen.java类 密码开锁界面
AccountUnlockScreen.java类 Google账户开锁界面
Keyguard源代码位于frameworks\base\policy\src\com\android\internal\policy\impl
一些自定义view --->frameworks\base\core\java\android\widget
Keyguard中各类的作用
LockPatternKeyguardView 继承至FrameLayout :
作为LockScreen和UnLockScreen的载体,用来控制显示LockScreen还是UnLockScreen界面。
LockScreen 继承至FrameLayout
PatterUnlockScreen ViewGroup类型 : 图案解锁界面
KeyguardViewHost继承至FrameLayout, 该ViewGroup作为顶层View,作为WindowManager的装饰对象添加至窗口。
KeyguardScreen 类 接口 ---->
功能:该接口的主要功能是为每个需要显示的界面:LockScreen或者UnLockScreen定义了四个方法,使其在不同的状态能够得到相应处理。优点就是: 利用设计原则的面向 接口编程,减少对具体对象的依赖。
KeyguardScreenCallback类 接口 ---->其唯一实现类位于LockPatternKeyguardView类的内部类
功能:每个需要显示的界面:LockScreen或者UnLockScreen都保存了该对象的唯一实例,用来向控制界面汇报情况。
KeyguardViewCallback类 接口 ----> 其唯一实现类是 KeyguardViewMediator类
功能: 提供了一些接口用来接受用户操作Screen的结果。
KeyguardWindowController类 接口 ----> 其唯一实现类是KeyguardViewManager类
功能:提供通用接口,判断该界面是否需要显示输入法窗口。
KeyguardViewManager类 ---->
功能:包装了WindowManager功能了,提供了添加、删除锁屏界面的功能。
KeyguardUpdateMonitor类
功能:该类的主要功能就是根据监视系统状态值的改变(例如:时间、SIM卡状态、电池电量;使用广播监听),根据这种状态值的改变回调监听了该状态信息的对象实例。
LockPatternKeyguardView类 (自定义ViewGroup)
功能:作为LockScreen和UnLockScreen界面的载体,控制显示哪个界面。
KeyguardViewBase类 抽象类 (自定义ViewGroup)
功能:为LockPatternKeyguardView提供了一组通用的方法 。需要值得注意的方法就是他对某些KeyEvent的监听,
当他消费监听到这些KeyEvent,我们的App就监听不到这些KeyEvent了 。常用的有KEYEVENT_VOLUME_UP/DOWN等。
KeyguardViewProperties接口 ----> 其唯一实现类是是LockPatternKeyguardViewProperties类
功能:提供了创建界面的通用方法。
LockPatternKeyguardViewProperties类
功能:创建一个LockPatternKeyguardView对象 .
KeyguardViewMediator核心类 ,该类是唯一实现了KeyguardViewCallback的类
功能:该类提供了一些接口,由PhoneWindowManager)去访问控制Keyguard....
该类的初始化是在PolicyWindowManager的构造函数中创建的.
GlobalActions.java
全局行为,这段代码就是处理锁屏界面长按Power键弹出的Dialog。关于静音模式/飞行模式和关机的。
IconUtilities.java
图标工具,图片处理的工具类,提供了一个drawable转bitmap的方法,还有个绘制bitmap按下的方法.
一些重要类的实例化:
PhoneWindowManager对象WindowManagerService.java中实例化,并在WindowManagerService的PolicyThread线程运行时初始化。
final WindowManagerPolicy mPolicy = PolicyManager.makeNewWindowManager();
static class PolicyThread extends Thread {
… …
public void run() {
Looper.prepare();
… …
mPolicy.init(mContext, mService, mService, mPM);//进入PhoneWindowManager中的init方法
… …
Looper.loop();
}
}
PhoneWindowManager .java类中,实例化KeyguardMediator对象
public void init(Context context, IWindowManager windowManager,
WindowManagerFuncs windowManagerFuncs,
LocalPowerManager powerManager) {
mContext = context;
… …
mKeyguardMediator = new KeyguardViewMediator(context, this, powerManager);
… …
}
KeyguardViewMediator构造函数中实例化PowerManager的三个锁及KeyguardUpdateMonitor、LockPatternKeyguardViewProperties、KeyguardViewManager对象。
public KeyguardViewMediator(Context context, PhoneWindowManager callback,
LocalPowerManager powerManager) {
mContext = context;
mRealPowerManager = powerManager;
mPM = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
//保证在 keyguard显示时能够显示一段时间后屏幕才能睡眠
mWakeLock = mPM.newWakeLock(
PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP,
"keyguard");
mWakeLock.setReferenceCounted(false);
//用于在keyguard显示要打开时能够保持设备唤醒
mShowKeyguardWakeLock = mPM.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "show keyguard");
mShowKeyguardWakeLock.setReferenceCounted(false);
//PhoneWindowManager截获事件进行触发,用于在用户按键或鼠标移动时唤醒设备便于对keyguard进行操作
mWakeAndHandOff = mPM.newWakeLock(
PowerManager.PARTIAL_WAKE_LOCK,
"keyguardWakeAndHandOff");
mWakeAndHandOff.setReferenceCounted(false);
… …
mUpdateMonitor = new KeyguardUpdateMonitor(context);
mLockPatternUtils = new LockPatternUtils(mContext);
mKeyguardViewProperties
= new LockPatternKeyguardViewProperties(mLockPatternUtils, mUpdateMonitor);
mKeyguardViewManager = new KeyguardViewManager(
context, WindowManagerImpl.getDefault(), this,
mKeyguardViewProperties, mUpdateMonitor);
… …
}
在KeyguardViewManager 的show中实例化KeyguardViewHost、LockPatternKeyguardView对象。
public synchronized void show() {
… …
mKeyguardHost = new KeyguardViewHost(mContext, mCallback);
… …
if (mKeyguardView == null) {
if (DEBUG) Xlog.d(TAG, "keyguard view is null, creating it...");
mKeyguardView = mKeyguardViewProperties.createKeyguardView(mContext, mUpdateMonitor, this);
mKeyguardView.setId(R.id.lock_screen);
mKeyguardView.setCallback(mCallback);
… …
}
}
在LockPatternKeyguardView的createLockScreen和createUnlockScreenFor函数中创建加锁和解锁屏幕.
Keyguard启动时序图:
Keyguard从屏亮---->屏灭, 再从屏灭--->屏亮,过程中两次按键时序图
时序图下载地址http://download.csdn.net/detail/ldinvicible/4761861