@OverridepublicintinterceptKeyBeforeQueueing(KeyEvent event,int policyFlags){if(!mSystemBooted){// If we have not yet booted, don't let key events do anything.return0;}........// Handle special keys.switch(keyCode){caseKeyEvent.KEYCODE_BACK:{if(down){interceptBackKeyDown();}else{boolean handled =interceptBackKeyUp(event);// Don't pass back press to app if we've already handled it via long pressif(handled){
result &=~ACTION_PASS_TO_USER;}}break;}caseKeyEvent.KEYCODE_POWER:{// Any activity on the power button stops the accessibility shortcutcancelPendingAccessibilityShortcutAction();
result &=~ACTION_PASS_TO_USER;
isWakeKey =false;// wake-up will be handled separatelyif(down){//这里走的是这个方法interceptPowerKeyDown(event, interactive);}else{interceptPowerKeyUp(event, interactive, canceled);}break;}....}}
这里分发出去了一个消息MSG_POWER_LONG_PRESS
privatevoidinterceptPowerKeyDown(KeyEvent event,boolean interactive){......// If the power key has still not yet been handled, then detect short// press, long press, or multi press and decide what to do.
mPowerKeyHandled = hungUp || mScreenshotChordVolumeDownKeyTriggered
|| mA11yShortcutChordVolumeUpKeyTriggered || gesturedServiceIntercepted;if(!mPowerKeyHandled){if(interactive){// When interactive, we're already awake.// Wait for a long press or for the button to be released to decide what to do.if(hasLongPressOnPowerBehavior()){Message msg = mHandler.obtainMessage(MSG_POWER_LONG_PRESS);
msg.setAsynchronous(true);
mHandler.sendMessageDelayed(msg,ViewConfiguration.get(mContext).getDeviceGlobalActionKeyTimeout());}}else{wakeUpFromPowerKey(event.getDownTime());if(mSupportLongPressPowerWhenNonInteractive &&hasLongPressOnPowerBehavior()){Message msg = mHandler.obtainMessage(MSG_POWER_LONG_PRESS);
msg.setAsynchronous(true);
mHandler.sendMessageDelayed(msg,ViewConfiguration.get(mContext).getDeviceGlobalActionKeyTimeout());
mBeganFromNonInteractive =true;}else{finalint maxCount =getMaxMultiPressPowerCount();if(maxCount <=1){
mPowerKeyHandled =true;}else{
mBeganFromNonInteractive =true;}}}}}
voidshowGlobalActionsInternal(){sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);if(mGlobalActions ==null){
mGlobalActions =newGlobalActions(mContext, mWindowManagerFuncs);}finalboolean keyguardShowing =isKeyguardShowingAndNotOccluded();
mGlobalActions.showDialog(keyguardShowing,isDeviceProvisioned());if(keyguardShowing){// since it took two seconds of long press to bring this up,// poke the wake lock so they have some time to see the dialog.
mPowerManager.userActivity(SystemClock.uptimeMillis(),false);}}publicvoidshowDialog(boolean keyguardShowing,boolean deviceProvisioned){if(DEBUG)Slog.d(TAG,"showDialog "+ keyguardShowing +" "+ deviceProvisioned);
mKeyguardShowing = keyguardShowing;
mDeviceProvisioned = deviceProvisioned;
mShowing =true;boolean isTvProduct =SystemProperties.get("ro.target.product","unknown").equals("atv")||SystemProperties.get("ro.target.product","unknown").equals("box");if(mStatusBarConnected &&!isTvProduct){
mStatusBarInternal.showGlobalActions();
mHandler.postDelayed(mShowTimeout,5000);}else{// SysUI isn't alive, show legacy menu.ensureLegacyCreated();
mLegacyGlobalActions.showDialog(mKeyguardShowing, mDeviceProvisioned);}}