介绍
0:什么都不做。长按电源按钮不会触发任何特殊操作。
1:显示全局操作菜单。长按电源按钮将显示一个包含各种全局操作选项的菜单,您可以从中选择执行不同的操作。
2:关机(带有确认)。长按电源按钮将触发设备的关机操作,并需要用户确认以执行关机。
3:关机(无需确认)。长按电源按钮将直接触发设备的关机操作,无需用户确认。
4:前往语音助手。长按电源按钮将启动语音助手,允许用户使用语音命令或语音搜索功能。
5:前往助手(Settings.Secure.ASSISTANT)。长按电源按钮将启动设备的默认助手应用程序,通常是谷歌助手或其他第三方助手。
首先长按Power的模式我们要切换一下 切换成长按无需确认直接关机将 以下属性改为3
路径:frameworks/base/core/res/res/values/config.xml
<!-- Control the behavior when the user long presses the power button.
0 - Nothing
1 - Global actions menu
2 - Power off (with confirmation)
3 - Power off (without confirmation)
4 - Go to voice assist
5 - Go to assistant (Settings.Secure.ASSISTANT)
-->
<integer name="config_longPressOnPowerBehavior">3</integer>
分析
PhoneWindowManager.java的interceptKeyBeforeQueueing方法中我们看到了长按Power的处理流程 目前长按会立即关机调用的是interceptPowerKeyDown这个方法,再往下走我们看到发送了一个消息MSG_POWER_LONG_PRESS,在PolicyHandler中我们看到实际上关机时调用的是powerLongPress()。这里我是利用延时的message进行操作的
private class PolicyHandler extends Handler {
//..略
case MSG_POWER_LONG_PRESS:
powerLongPress();
break;
}
@Override
public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {
//...略
case KeyEvent.KEYCODE_POWER: {
EventLogTags.writeInterceptPower(
KeyEvent.actionToString(event.getAction()),
mPowerKeyHandled ? 1 : 0, mPowerKeyPressCounter);
// 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;
}
}
修改
增加3秒延迟 并且如果按下时间不足3s取消message的发送
路径:frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
@Override
public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {
//..略
case KeyEvent.KEYCODE_POWER: {
//*/soda water.20230907 Five-second shutdown
if (down) {
Message msg = mHandler.obtainMessage(MSG_POWER_LONG_PRESS);
msg.setAsynchronous(true);
mHandler.sendMessageDelayed(msg,3000);
} else {
mHandler.removeMessages(MSG_POWER_LONG_PRESS);
}
//*/soda water.20230907 Five-second shutdown
break;
}
/*/
case KeyEvent.KEYCODE_POWER: {
EventLogTags.writeInterceptPower(
KeyEvent.actionToString(event.getAction()),
mPowerKeyHandled ? 1 : 0, mPowerKeyPressCounter);
// 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;
}
}
//*/