android在长按Power键(手机或pad)或按下电源键(电视)会进入待机状态,下面分析一下非STR待机流程。
待机分STR和非STR待机。
STR待机是为了实现快速开关机,提高开机速度。android自身支持STR,OEM可以根据自身需要进行深度定制。STR待机时,PM芯片仍然供电,其他断电,当STR开机时,从PM芯片唤醒,回复到STR待机前状态,从而提高开机速度。
非STR待机即正常待机,待机后会彻底断电,这里只分析android层的行为。
1 PhoneWindowManager处理逻辑
按键在给到WindowManagerService之前,会先给到PhoneWindowManager进行处理。
/** {@inheritDoc} */
@Override
public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {
//KeyEvent入队
...
case KeyEvent.KEYCODE_POWER: {
Log.d(TAG,"KEYCODE_POWER.....");
result &= ~ACTION_PASS_TO_USER;
isWakeKey = false; // wake-up will be handled separately
if (down) {
interceptPowerKeyDown(event, interactive);
} else {
interceptPowerKeyUp(event, interactive, canceled);
}
break;
在key Down时,执行interceptPowerKeyDown逻辑,这段逻辑会处理正常待机流程。
在key Up时,执行interceptPowerKeyUp逻辑,这段逻辑出来STR待机流程。
private void interceptPowerKeyDown(KeyEvent event, boolean interactive) {
// Hold a wake lock until the power key is released.
if (!mPowerKeyWakeLock.isHeld()) {
//获取wakeLock
mPowerKeyWakeLock.acquire();
}
...
// Latch power key state to detect screenshot chord.
if (interactive && !mScreenshotChordPowerKeyTriggered
&& (event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) {
mScreenshotChordPowerKeyTriggered = true;
mScreenshotChordPowerKeyTime = event.getDownTime();
//截图,STR和非STR待机都会执行截图,截图为了在待机时画面看起来很和谐
interceptScreenshotChord();
}
...
// When interactive, we're already awake.
// Wait for a long press or for the button to be released to decide what to do.
if (hasLongPressOnPowerBehavior()) { //如果不是LONG_PRESS_POWER_NOTHING
if (enable_str == false) { //非STR
if (mShortPressOnPowerBehavior < 0) { //如果等于0,重新赋值
mShortPressOnPowerBehavior = mContext.getResources().getInteger(
com.android.internal.R.integer.config_shortPressOnPowerBehavior);
}
//发送MSG_POWER_LONG_PRESS,处理待机事件
Message msg = mHandler.obtainMessage(MSG_POWER_LONG_PRESS);
msg.setAsynchronous(true);
//是否延迟待机
mHandler.sendMessageDelayed(msg,
(mShortPressOnPowerBehavior == SHORT_PRESS_POWER_SHUT_DOWN) ?
0 : ViewConfiguration.get(mContext).getDeviceGlobalActionKeyTimeout());
}
config_shortPressOnPowerBehavior默认值是1,在frameworks\base\core\res\res\values\config.xml中有定义:
<!-- Control the behavior when the user short presses the power button.
0 - Nothing
1 - Go to sleep (doze)
2 - Really go to sleep (don't doze)
3 - Really go to sl