Android 9.0灭屏流程
Power键灭屏
当power键灭屏时,会在PhoneWindowManager中处理按键事件后,调用到PMS的gotoSleep()进行灭屏处理,下面直接看看PhoneWindowManger中对Power键灭屏的处理以及和PMS的交互。在按power后,PWS中如下:
//frameworks/base/services/core/java/com/android/
//server/policy/PhoneWindowManager.java
case KeyEvent.KEYCODE_POWER: {
// Any activity on the power button stops the accessibility shortcut
cancelPendingAccessibilityShortcutAction();
result &= ~ACTION_PASS_TO_USER;
isWakeKey = false; // wake-up will be handled separately
if (down) {
//按下时
//处理按下事件
interceptPowerKeyDown(event, interactive);
} else //抬起时
//处理抬起事件
interceptPowerKeyUp(event, interactive, canceled);
}
break;
}
在处理Power键抬起事件时,开始了灭屏流程:
private void powerPress(long eventTime, boolean interactive, int count) {
if (mScreenOnEarly && !mScreenOnFully) {
Slog.i(TAG, "Suppressed redundant power key press while "
+ "already in the process of turning the screen on.");
return;
}
if (count == 2) {
......
} else if (interactive && !mBeganFromNonInteractive) {
switch (mShortPressOnPowerBehavior) {
//灭屏
case SHORT_PRESS_POWER_GO_TO_SLEEP:
goToSleep(eventTime, PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON, 0);
break;
//灭屏,直接跳过Doze状态
case SHORT_PRESS_POWER_REALLY_GO_TO_SLEEP:
goToSleep(eventTime, PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON,
PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE);
break;
} else {
shortPressPowerGoHome();
}
break;
}
}
}
}
在这里调用了goToSleep()方法,该方法如下:
private void goToSleep(long eventTime, int reason, int flags) {
mRequestedOrGoingToSleep = true;
mPowerManager.goToSleep(eventTime, reason, flags);
}
最终,PhoneWindowManager中调用了PowerManager的goToSleep()方法来灭屏。我们进入到PowerManager.goToSleep()方法:
///home/wll/source_code/s219_qun/frameworks/base/core/java/
//android/os/PowerManager.java
public void goToSleep(long time, int reason, int flags) {
try {
mService.