在Android4.1下长按POWER键自动关机

时间:2022-10-27 05:58:24

控制POWER键长按的code位于PhoneWindowManager.java中

    private final Runnable mPowerLongPress = new Runnable() {
        public void run() {
            // The context isn't read
            if (mLongPressOnPowerBehavior < 0) {
                mLongPressOnPowerBehavior = mContext.getResources().getInteger(
                        com.android.internal.R.integer.config_longPressOnPowerBehavior);
            }
            switch (mLongPressOnPowerBehavior) {
            case LONG_PRESS_POWER_NOTHING:
                break;
            case LONG_PRESS_POWER_GLOBAL_ACTIONS:
                mPowerKeyHandled = true;
                performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false);
                sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);
                showGlobalActionsDialog();
                break;
            case LONG_PRESS_POWER_SHUT_OFF:
                mPowerKeyHandled = true;
                performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false);
                sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);
                mWindowManagerFuncs.shutdown();
                break;
            }
        }
    };

可知按键后的行为取决于config_longPressOnPowerBehavior,这个值的定义位于framework/base/core/res/res/values/config.xml中,default value为1,将其改为2(匹配上面的LONG_PRESS_POWER_SHUT_OFF)。
这时候长按POWER键出现的不是带有飞行模式|重启|关机等BUTTON的对话框,而是询问是否关机的对话框。

接下来取消该对话框,trace mWindowManagerFuncs.shutdown(),这个方法的实现位于WindowManagerService,直接调用ShutdownThread.shutdown(mContext, true),将true改为false则不询问直接关机。

如果要定义长按的时间,则回到PhoneWindowManager.java中

private void interceptPowerKeyDown(boolean handled) {
        mPowerKeyHandled = handled;
        if (!handled) {
            mHandler.postDelayed(mPowerLongPress, ViewConfiguration.getGlobalActionKeyTimeout());
        }
    }

    private boolean interceptPowerKeyUp(boolean canceled) {
        if (!mPowerKeyHandled) {
            mHandler.removeCallbacks(mPowerLongPress);
            return !canceled;
        }
        return false;
    }

前者定义任务:当POWER键按下一定时间后,将mPowerLongPress插入队列运行,后者定义在这段时间内松开POWER键则取消此任务。

trace ViewConfiguration.getGlobalActionKeyTimeout(),此方法返回在ViewConfiguration.java中定义的常量GLOBAL_ACTIONS_KEY_TIMEOUT,default value为500,即500ms,将其改为指定的值。

至此长按POWER键直接关机定制完成。