frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
public long interceptKeyBeforeDispatching(IBinder focusedToken, KeyEvent event,int policyFlags) {
case KeyEvent.KEYCODE_POWER: {
//发送广播给 KeyguardViewMediator.java
Intent mIntent = new Intent("xxx.delayLockScreen");
mContext.sendBroadcast(mIntent);
}
}
frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
private int LockScreenNum = 0; //锁屏计数器
private void setupLocked() {
//注册广播
IntentFilter filter1 = new IntentFilter();
filter1.addAction("xxx.delayLockScreen");
mBroadcastDispatcher.registerReceiver(myDelayLockScreenBroadcastReceiver, filter1);
}
public void onFinishedGoingToSleep(int why, boolean cameraGestureTriggered) {
if (mPendingLock) {
//start
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(500);
//根据计数器判断睡眠模式是否为深度睡眠
if (LockScreenNum==0){
doKeyguardLocked(null);
}
mPendingLock = false;
LockScreenNum = 0;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
//end
}
}
private final BroadcastReceiver myDelayLockScreenBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//如果屏幕仍然被立即点击,计数器将+1
if (mPendingLock)
LockScreenNum++;
}
};