控制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键直接关机定制完成。