需求
Android设备或手机,长按power键(电源键)大概3秒,会弹出一个确认关机或重启的窗口,如下
需求是长按时不弹窗口,直接关机。
长按power键处理代码
先分析下安卓的生的代码
frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
private void powerLongPress() {
final int behavior = getResolvedLongPressOnPowerBehavior();
switch (behavior) {
case LONG_PRESS_POWER_NOTHING:
break;
case LONG_PRESS_POWER_GLOBAL_ACTIONS:
mPowerKeyHandled = true;
performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, false,
"Power - Long Press - Global Actions");
showGlobalActionsInternal();
break;
case LONG_PRESS_POWER_SHUT_OFF:
case LONG_PRESS_POWER_SHUT_OFF_NO_CONFIRM:
mPowerKeyHandled = true;
performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, false,
"Power - Long Press - Shut Off");
sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);
mWindowManagerFuncs.shutdown(behavior == LONG_PRESS_POWER_SHUT_OFF);
break;
case LONG_PRESS_POWER_GO_TO_VOICE_ASSIST:
mPowerKeyHandled = true;
performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, false,
"Power - Long Press - Go To Voice Assist");
// Some devices allow the voice assistant intent during setup (and use that intent
// to launch something else, like Settings). So we explicitly allow that via the
// config_allowStartActivityForLongPressOnPowerInSetup resource in config.xml.
launchVoiceAssist(mAllowStartActivityForLongPressOnPowerDuringSetup);
break;
case LONG_PRESS_POWER_ASSISTANT:
mPowerKeyHandled = true;
performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, false,
"Power - Long Press - Go To Assistant");
final int powerKeyDeviceId = Integer.MIN_VALUE;
launchAssistAction(null, powerKeyDeviceId);
break;
}
}
源码剖析
方法作用
该方法定义了用户长按电源键时系统应执行的操作,根据不同的配置和设备策略,会触发不同的系统行为。
获取长按电源键的行为配置
final int behavior = getResolvedLongPressOnPowerBehavior();
通过getResolvedLongPressOnPowerBehavior()方法获取系统配置的长按电源键行为,返回值是一个表示具体行为的常量。
根据不同行为执行相应操作
使用switch语句根据behavior的值执行不同逻辑:
- LONG_PRESS_POWER_NOTHING:
什么都不做,仅break跳出分支。 - LONG_PRESS_POWER_GLOBAL_ACTIONS:
- 标记电源键事件已被处理(mPowerKeyHandled = true)
- 触发长按的触觉反馈(震动)
- 调用showGlobalActionsInternal()显示全局操作菜单(即常见的电源菜单,包含关机、重启、飞行模式等选项)
- LONG_PRESS_POWER_SHUT_OFF 和 LONG_PRESS_POWER_SHUT_OFF_NO_CONFIRM:
- 标记电源键事件已被处理
- 触发触觉反馈
- 发送关闭系统窗口的通知(原因是全局操作)
- 调用mWindowManagerFuncs.shutdown()执行关机操作:
- LONG_PRESS_POWER_SHUT_OFF:需要确认的关机
- LONG_PRESS_POWER_SHUT_OFF_NO_CONFIRM:无需确认直接关机(这个处理方式就是我们要的)
- LONG_PRESS_POWER_GO_TO_VOICE_ASSIST:
- 标记电源键事件已被处理
- 触发触觉反馈
- 调用launchVoiceAssist()启动语音助手
注释说明:某些设备在设置过程中也允许此操作,通过配置项控制
- LONG_PRESS_POWER_ASSISTANT:
- 标记电源键事件已被处理
- 触发触觉反馈
- 调用launchAssistAction()启动辅助功能(通常是系统助手)
关键知识点
- mPowerKeyHandled:用于标记电源键事件是否已被处理,避免事件被重复处理
- performHapticFeedback:提供触觉反馈,增强用户操作感知
- 不同设备制造商可能通过修改getResolvedLongPressOnPowerBehavior()的返回值来定制长按电源键的行为
这些行为常量(如LONG_PRESS_POWER_GLOBAL_ACTIONS)定义了 Android 系统对长按电源键的标准响应方式
代码实现
第一种
frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
在powerLongPress中,把behavior直接赋值为LONG_PRESS_POWER_SHUT_OFF_NO_CONFIRM就可以了
private void powerLongPress() {
final int behavior = LONG_PRESS_POWER_SHUT_OFF_NO_CONFIRM;//getResolvedLongPressOnPowerBehavior();
switch (behavior) {
case LONG_PRESS_POWER_NOTHING:
break;
case LONG_PRESS_POWER_GLOBAL_ACTIONS:
mPowerKeyHandled = true;
performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, false,
"Power - Long Press - Global Actions");
showGlobalActionsInternal();
break;
case LONG_PRESS_POWER_SHUT_OFF:
case LONG_PRESS_POWER_SHUT_OFF_NO_CONFIRM:
mPowerKeyHandled = true;
performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, false,
"Power - Long Press - Shut Off");
sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);
mWindowManagerFuncs.shutdown(behavior == LONG_PRESS_POWER_SHUT_OFF);
break;
case LONG_PRESS_POWER_GO_TO_VOICE_ASSIST:
mPowerKeyHandled = true;
performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, false,
"Power - Long Press - Go To Voice Assist");
// Some devices allow the voice assistant intent during setup (and use that intent
// to launch something else, like Settings). So we explicitly allow that via the
// config_allowStartActivityForLongPressOnPowerInSetup resource in config.xml.
launchVoiceAssist(mAllowStartActivityForLongPressOnPowerDuringSetup);
break;
case LONG_PRESS_POWER_ASSISTANT:
mPowerKeyHandled = true;
performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, false,
"Power - Long Press - Go To Assistant");
final int powerKeyDeviceId = Integer.MIN_VALUE;
launchAssistAction(null, powerKeyDeviceId);
break;
}
}
第二种
除了修改代码外,还有一种是修改配置文件
frameworks/base/core/res/res/values/config.xml
其中config_longPressOnPowerBehavior就是要改的
<integer name="config_longPressOnPowerBehavior">3</integer>
改成3就可以了,其中有0到5各个值的注释说明:
该整数配置值对应PhoneWindowManager中定义的行为常量:
- 0:LONG_PRESS_POWER_NOTHING(无操作)
- 1:LONG_PRESS_POWER_GLOBAL_ACTIONS(显示全局操作菜单,默认值)
- 2:LONG_PRESS_POWER_SHUT_OFF(关机,需要确认)
- 3:LONG_PRESS_POWER_SHUT_OFF_NO_CONFIRM(关机,无需确认)
- 4:LONG_PRESS_POWER_GO_TO_VOICE_ASSIST(启动语音助手)
- 5:LONG_PRESS_POWER_ASSISTANT(启动系统助手)
作者:帅得不敢出门