Android Framework不弹窗直接关机

需求

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(启动系统助手)

作者:帅得不敢出门

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅得不敢出门

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值