Android14关机流程
1. 长按power键的弹框界面
frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java
private void powerLongPress(long eventTime) {final int behavior = getResolvedLongPressOnPowerBehavior();Slog.d(TAG, "powerLongPress: eventTime=" + eventTime+ " mLongPressOnPowerBehavior=" + mLongPressOnPowerBehavior);switch (behavior) {case LONG_PRESS_POWER_NOTHING:break;case LONG_PRESS_POWER_GLOBAL_ACTIONS: //长按powermPowerKeyHandled = true;performHapticFeedback(HapticFeedbackConstants.LONG_PRESS_POWER_BUTTON, false,"Power - Long Press - Global Actions");showGlobalActions(); //这里调用break;.......@Overridepublic void showGlobalActions() {mHandler.removeMessages(MSG_DISPATCH_SHOW_GLOBAL_ACTIONS);mHandler.sendEmptyMessage(MSG_DISPATCH_SHOW_GLOBAL_ACTIONS);}void showGlobalActionsInternal() {if (mGlobalActions == null) {mGlobalActions = mGlobalActionsFactory.get();}final boolean keyguardShowing = isKeyguardShowingAndNotOccluded();//这里调用mGlobalActions.showDialog(keyguardShowing, isDeviceProvisioned());// 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);}
frameworks\base\services\core\java\com\android\server\policy\GlobalActions.java
public void showDialog(boolean keyguardShowing, boolean deviceProvisioned) {if (DEBUG) Slog.d(TAG, "showDialog " + keyguardShowing + " " + deviceProvisioned);if (mGlobalActionsProvider != null && mGlobalActionsProvider.isGlobalActionsDisabled()) {return;}mKeyguardShowing = keyguardShowing;mDeviceProvisioned = deviceProvisioned;mShowing = true;if (mGlobalActionsAvailable) {mHandler.postDelayed(mShowTimeout, 5000);mGlobalActionsProvider.showGlobalActions();//这里调用} else {// SysUI isn't alive, show legacy menu.ensureLegacyCreated();mLegacyGlobalActions.showDialog(mKeyguardShowing, mDeviceProvisioned);}}
frameworks\base\services\core\java\com\android\server\statusbar\StatusBarManagerService.java
private volatile IStatusBar mBar;private final GlobalActionsProvider mGlobalActionsProvider = new GlobalActionsProvider() {@Overridepublic boolean isGlobalActionsDisabled() {// TODO(b/118592525): support global actions for multi-display.final int disabled2 = mDisplayUiState.get(DEFAULT_DISPLAY).getDisabled2();return (disabled2 & DISABLE2_GLOBAL_ACTIONS) != 0;}@Overridepublic void setGlobalActionsListener(GlobalActionsProvider.GlobalActionsListener listener) {mGlobalActionListener = listener;mGlobalActionListener.onGlobalActionsAvailableChanged(mBar != null);}@Overridepublic void showGlobalActions() {if (mBar != null) {try {mBar.showGlobalActionsMenu();//这里调用} catch (RemoteException ex) {}}}};
SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
@Overridepublic void showGlobalActionsMenu() {synchronized (mLock) {mHandler.removeMessages(MSG_SHOW_GLOBAL_ACTIONS);mHandler.obtainMessage(MSG_SHOW_GLOBAL_ACTIONS).sendToTarget();}}
SystemUI/src/com/android/systemui/globalactions/GlobalActionsComponent.java
private Extension<GlobalActions> mExtension;@Overridepublic void handleShowGlobalActionsMenu() {mStatusBarKeyguardViewManager.setGlobalActionsVisible(true);mExtension.get().showGlobalActions(this);}
接口
SystemUI\src\com\android\systemui\globalactions\GlobalActionsImpl.java
public class GlobalActionsImpl implements GlobalActions, CommandQueue.Callbacks {@Overridepublic void showGlobalActions(GlobalActionsManager manager) {if (mDisabled) return;//这里调用GlobalActionsDialogLite的showOrHideDialog方法mGlobalActionsDialog.showOrHideDialog(mKeyguardStateController.isShowing(),mDeviceProvisionedController.isDeviceProvisioned(), null /* view */);}
frameworks\base\packages\SystemUI\src\com\android\systemui\globalactions\GlobalActionsDialogLite.java
public void showOrHideDialog(boolean keyguardShowing, boolean isDeviceProvisioned,@Nullable Expandable expandable) {mKeyguardShowing = keyguardShowing;mDeviceProvisioned = isDeviceProvisioned;if (mDialog != null && mDialog.isShowing()) {// In order to force global actions to hide on the same affordance press, we must// register a call to onGlobalActionsShown() first to prevent the default actions// menu from showing. This will be followed by a subsequent call to// onGlobalActionsHidden() on dismiss()mWindowManagerFuncs.onGlobalActionsShown();mDialog.dismiss();mDialog = null;} else {handleShow(expandable);//这里显示弹框}}@VisibleForTestingprotected void createActionItems() {// Simple toggle style if there's no vibrator, otherwise use a tri-stateif (!mHasVibrator) {mSilentModeAction = new SilentModeToggleAction()