描述:
Android平板或手机上,长按POWER键, 一般会弹出关机选择界面,提示关机或重启啥的。现在项目要求长按Power键直接进入休眠。
实现:
源码frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java中有interceptPowerKeyDown()方法,如果是长按,则会运行mPowerLongPress线程,我们来看mPowerLongPress线程的源码(注意红色部分是新添加的休眠代码):
private final Runnable mPowerLongPress = new Runnable() {
@Override
public void run() {
// The context isn't read
if (mLongPressOnPowerBehavior < 0) {
mLongPressOnPowerBehavior = mContext.getResources().getInteger(
com.android.internal.R.integer.config_longPressOnPowerBehavior);
}
int resolvedBehavior = mLongPressOnPowerBehavior;
if (FactoryTest.isLongPressOnPowerOffEnabled()) {
resolvedBehavior = LONG_PRESS_POWER_SHUT_OFF_NO_CONFIRM;
}
switch (resolvedBehavior) {
case LONG_PRESS_POWER_NOTHING:
mPowerKeyHandled = true;
mPowerManager.goToSleep(SystemClock.uptimeMillis()); // here here ...
break;
case LONG_PRESS_POWER_GLOBAL_ACTIONS:
mPowerKeyHandled = true;
if (!performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false)) {
performAuditoryFeedbackForAccessibilityIfNeed();
}
sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);
showGlobalActionsDialog();
break;
case LONG_PRESS_POWER_SHUT_OFF:
case LONG_PRESS_POWER_SHUT_OFF_NO_CONFIRM:
mPowerKeyHandled = true;
performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false);
sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);
mWindowManagerFuncs.shutdown(resolvedBehavior == LONG_PRESS_POWER_SHUT_OFF);
break;
}
}
};
即根据resolvedBehavior不同,执行不同的操作流程,所以我们修改frameworks/base/core/res/res/values/config.xml把config_longPressOnPowerBehavior的值改为0,如下:
$ git diff frameworks/base/core/res/res/values/config.xml
diff --git a/bsp/android/frameworks/base/core/res/res/values/config.xml b/bsp/android/frameworks/base/core/res/res/values/config.xml
index 84718bd..7322ca0 100755
--- a/bsp/android/frameworks/base/core/res/res/values/config.xml
+++ b/bsp/android/frameworks/base/core/res/res/values/config.xml
@@ -406,7 +406,7 @@
1 - Global actions menu
2 - Power off (with confirmation)
-->
- <integer name="config_longPressOnPowerBehavior">2</integer> //原来的代码
+ <integer name="config_longPressOnPowerBehavior">0</integer> //修改后
总结:
1. 修改config.xml,把config_longPressOnPowerBehavior的值设置为0
2. 修改PhoneWindowManager.java中mPowerLongPress的run方法,当resolvedBehavior为LONG_PRESS_POWER_NOTHING时,调用休眠流程。