Android14关机流程

发布于:2025-06-16 ⋅ 阅读:(16) ⋅ 点赞:(0)

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: //长按power
                mPowerKeyHandled = true;
                performHapticFeedback(HapticFeedbackConstants.LONG_PRESS_POWER_BUTTON, false,
                        "Power - Long Press - Global Actions");
                showGlobalActions(); //这里调用
                break;
                .......
                
    @Override
    public 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() {
   
        @Override
        public 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;
        }

        @Override
        public void setGlobalActionsListener(GlobalActionsProvider.GlobalActionsListener listener) {
   
            mGlobalActionListener = listener;
            mGlobalActionListener.onGlobalActionsAvailableChanged(mBar != null);
        }

        @Override
        public void showGlobalActions() {
   
            if (mBar != null) {
   
                try {
   
                    mBar.showGlobalActionsMenu();//这里调用
                } catch (RemoteException ex) {
   }
            }
        }
    };

SystemUI/src/com/android/systemui/statusbar/CommandQueue.java

    @Override
    public 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;
    @Override
    public void handleShowGlobalActionsMenu() {
   
        mStatusBarKeyguardViewManager.setGlobalActionsVisible(true);
        mExtension.get().showGlobalActions(this);
    }

接口

SystemUI\src\com\android\systemui\globalactions\GlobalActionsImpl.java

public class GlobalActionsImpl implements GlobalActions, CommandQueue.Callbacks {
   
    @Override
    public 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);//这里显示弹框
        }
    }
    
@VisibleForTesting
    protected void createActionItems() {
   
        // Simple toggle style if there's no vibrator, otherwise use a tri-state
        if (!mHasVibrator) {
   
            mSilentModeAction = new SilentModeToggleAction()

网站公告

今日签到

点亮在社区的每一天
去签到