在framework中找到 PhoneWindowManager.java,具体文件:

1
base/services/core/java/com/android/server/policy/PhoneWindowManager.java

然后找到有个专门处理多次点击关机按钮事件的方法 powerMultiPressAction,然后根据自己需要调整代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
private void powerMultiPressAction(long eventTime, boolean interactive, int behavior) {  
// LXB PATCH BEGIN
switch (behavior) {
case MULTI_PRESS_POWER_NOTHING:
break;
case MULTI_PRESS_POWER_THEATER_MODE:
if (!isUserSetupComplete()) {
Slog.i(TAG, "Ignoring toggling theater mode - device not setup.");
break; }

if (isTheaterModeEnabled()) {
Slog.i(TAG, "Toggling theater mode off.");
Settings.Global.putInt(mContext.getContentResolver(),
Settings.Global.THEATER_MODE_ON, 0);
if (!interactive) {
wakeUpFromPowerKey(eventTime);
}
} else {
Slog.i(TAG, "Toggling theater mode on.");
Settings.Global.putInt(mContext.getContentResolver(),
Settings.Global.THEATER_MODE_ON, 1);

if (mGoToSleepOnButtonPressTheaterMode && interactive) {
goToSleep(eventTime, PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON, 0);
}
}
break;
case MULTI_PRESS_POWER_BRIGHTNESS_BOOST:
Slog.i(TAG, "Starting brightness boost.");
if (!interactive) {
wakeUpFromPowerKey(eventTime);
}
mPowerManager.boostScreenBrightness(eventTime);
break; }
// LXB PATCH END
}

这里是处理代码逻辑了,如果你只是屏蔽之类的,可以通过配置解决,具体可以通过这个方法的第三个参数 behavior 反查,找到相应的配置参数。

首先查方法 powerMultiPressAction 调用:

1
2
3
4
5
6
7
if (count == 2) {  
powerMultiPressAction(eventTime, interactive, mDoublePressOnPowerBehavior);
} else if (count == 3) {
powerMultiPressAction(eventTime, interactive, mTriplePressOnPowerBehavior);
} else if (interactive && !mBeganFromNonInteractive) {
.........
}

可以看到这里 power 键点击2次和3次采用的是不一样的配置,这里我们查点击2次的参数 mDoublePressOnPowerBehavior ,

1
2
mDoublePressOnPowerBehavior = mContext.getResources().getInteger(  
com.android.internal.R.integer.config_doublePressOnPowerBehavior);

看到这个,就会明白读取的是 config 资源,然后我们直接去 core/res/res/values/config.xml 查找即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!-- 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 sleep and go home (don't doze)
            4 - Go to home
            5 - Dismiss IME if shown. Otherwise go to home
    -->
    <integer name="config_shortPressOnPowerBehavior">1</integer>

    <!-- Control the behavior when the user double presses the power button.
            0 - Nothing
            1 - Toggle theater mode setting
            2 - Brightness boost
    -->
    <integer name="config_doublePressOnPowerBehavior">0</integer>

    <!-- Control the behavior when the user triple presses the power button.
            0 - Nothing
            1 - Toggle theater mode setting
            2 - Brightness boost
    -->
    <integer name="config_triplePressOnPowerBehavior">0</integer>

可以看到,这里连续几个配置都是点击 power 键的参数,我们就可以根据需要调整了。

我这里用的是 MTK TV 方案的AOSP源码,不同的方案商的代码可能有点差别,但都大同小异,核心的东西还是差不多,查找解决办法也差不多。