在frameworks/base/policy/src目录下com.android.internal.policy.impl包从字面上理解是java框架里策略性的代码。里面包含了锁屏和解锁的源码类实现。
KeyguardViewBase.java是基础类,继承于framelayout,定义了键盘锁的本质功能的抽象方法。
abstract method:
reset();onScreenTurnedOff();onScreenTurnedOn();show();wakeWhenReadyTq(int keyCode);verifyUnlock();cleanUp();
其中wakeWhenReadyTq方法是接收到了需要唤醒设备的key值,这些值在WindowManagerPolicy这个接口中定义:
public final static int FLAG_WAKE = 0x00000001;
public final static int FLAG_WAKE_DROPPED = 0x00000002;
public final static int FLAG_WOKE_HERE = 0x10000000;
public final static int ACTION_GO_TO_SLEEP = 0x00000004;
在这个方法里不要做耗时操作,应该把它post到handler中去完成相应的功能。
这个基础类中还实现了关于锁屏界面的屏幕高亮和多媒体按键的相应处理。
在dispatchKeyEvent方法中调用shouldEventKeepScreenOnWhileKeyguardShowing(KeyEvent event);和interceptMediaKey(KeyEvent event);
shouldEventKeepScreenOnWhileKeyguardShowing方法中检测到有触摸的Down事件就会使用KeyguardViewCallback的pokeWakelock()回调函数进行处理。
代码如下:
if (event.getAction() != KeyEvent.ACTION_DOWN) {
return false;
}
switch (event.getKeyCode()) {
case KeyEvent.KEYCODE_DPAD_DOWN:
case KeyEvent.KEYCODE_DPAD_LEFT:
case KeyEvent.KEYCODE_DPAD_RIGHT:
case KeyEvent.KEYCODE_DPAD_UP:
return false;
default:
return true;
}
在dispatch中检测到媒体事件会返回true拦截掉使用后续事件,不会继续下发。
代码如下:
if (shouldEventKeepScreenOnWhileKeyguardShowing(event)) {
mCallback.pokeWakelock();
}
if (interceptMediaKey(event)) {
return true;
}
return super.dispatchKeyEvent(event);
在interceptMediaKey中所做的是多媒体的键值判断,进行相应的处理。
以上为目前进度。待续。