Activity Stop Conditions and Principles

basic knowledge

Stop entrance

During this process, it is judged whether the ActivityRecord added to the Stopping list is executing the animation, and the page that is executing the exit animation cannot execute the stop process.
How to judge that ActivityRecord is performing animation

    /**
     * Processes the activities to be stopped or destroyed. This should be called when the resumed
     * activities are idle or drawn.
     */
    private void processStoppingAndFinishingActivities(ActivityRecord launchedActivity,
            boolean processPausingActivities, String reason) {
    
    
        // Stop any activities that are scheduled to do so but have been waiting for the transition
        // animation to finish.
        ArrayList<ActivityRecord> readyToStopActivities = null;
        for (int i = mStoppingActivities.size() - 1; i >= 0; --i) {
    
    
            final ActivityRecord s = mStoppingActivities.get(i);
            // 遍历取出mStoppingActivities并判断当前Activity是否正在执行动画
            final boolean animating = s.isAnimating(TRANSITION | PARENTS,
                    ANIMATION_TYPE_APP_TRANSITION | ANIMATION_TYPE_RECENTS)
                    || s.inTransition();
            ProtoLog.v(WM_DEBUG_STATES, "Stopping %s: nowVisible=%b animating=%b "
                    + "finishing=%s", s, s.nowVisible, animating, s.finishing);
            // 没有执行动画才能继续走
            if (!animating || mService.mShuttingDown) {
    
    
                if (!processPausingActivities && s.isState(PAUSING)) {
    
    
                    // Defer processing pausing activities in this iteration and reschedule
                    // a delayed idle to reprocess it again
                    removeIdleTimeoutForActivity(launchedActivity);
                    scheduleIdleTimeout(launchedActivity);
                    continue;
                }

                ProtoLog.v(WM_DEBUG_STATES, "Ready to stop: %s", s);
                if (readyToStopActivities == null) {
    
    
                    readyToStopActivities = new ArrayList<>();
                }
                // 更换列表
                readyToStopActivities.add(s);

                mStoppingActivities.remove(i);
            }
        }
    	// 执行Activity的stopIfPossible
        final int numReadyStops = readyToStopActivities == null ? 0 : readyToStopActivities.size();
        for (int i = 0; i < numReadyStops; i++) {
    
    
            final ActivityRecord r = readyToStopActivities.get(i);
            if (r.isInHistory()) {
    
    
                if (r.finishing) {
    
    
                    // TODO(b/137329632): Wait for idle of the right activity, not just any.
                    r.destroyIfPossible(reason);
                } else {
    
    
                    r.stopIfPossible();
                }
            }
        }

      ........
    }

Processing the Stopping list comes from the following two lines:

Execute IDLE_NOW_MSG message

                case IDLE_NOW_MSG: {
    
    
                    if (DEBUG_IDLE) Slog.d(TAG_IDLE, "handleMessage: IDLE_NOW_MSG: r=" + msg.obj);
                    activityIdleFromMessage((ActivityRecord) msg.obj, false /* fromTimeout */);
                } break;
        ......

        private void activityIdleFromMessage(ActivityRecord idleActivity, boolean fromTimeout) {
    
    
            activityIdleInternal(idleActivity, fromTimeout,
                    fromTimeout /* processPausingActivities */, null /* config */);
        }

The app side calls back activityIdle

    @Override
    public void activityIdle(IBinder token, Configuration config, boolean stopProfiling) {
    
    
        final long origId = Binder.clearCallingIdentity();
        try {
    
    
            synchronized (mGlobalLock) {
    
    
                Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "activityIdle");
                final ActivityRecord r = ActivityRecord.forTokenLocked(token);
                if (r == null) {
    
    
                    return;
                }
                mTaskSupervisor.activityIdleInternal(r, false /* fromTimeout */,
                        false /* processPausingActivities */, config);
                if (stopProfiling && r.hasProcess()) {
    
    
                    r.app.clearProfilerIfNeeded();
                }
            }
        } finally {
    
    
            Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
            Binder.restoreCallingIdentity(origId);
        }
    }

Execute PROCESS_STOPPING_AND_FINISHING_MSG message

                case PROCESS_STOPPING_AND_FINISHING_MSG: {
    
    
                    processStoppingAndFinishingActivities(null /* launchedActivity */,
                            false /* processPausingActivities */, "transit");
                } break;

Execute IDLE_TIMEOUT_MSG timeout message

                case IDLE_TIMEOUT_MSG: {
    
    
                    if (DEBUG_IDLE) Slog.d(TAG_IDLE,
                            "handleMessage: IDLE_TIMEOUT_MSG: r=" + msg.obj);
                    // We don't at this point know if the activity is fullscreen, so we need to be
                    // conservative and assume it isn't.
                    activityIdleFromMessage((ActivityRecord) msg.obj, true /* fromTimeout */);
                } break;

send related news

In the message queue of the display thread, the message will be sent only when there is no IDLE_NOW_MSG message;

    final void scheduleIdle() {
    
    
        if (!mHandler.hasMessages(IDLE_NOW_MSG)) {
    
    
            mHandler.sendEmptyMessage(IDLE_NOW_MSG);
        }
    }

IDLE_NOW_MSG - sent directly

After the previous page completes the pause, trigger makeInvisible on the system server side, add the current page to the stoppping list and try to send an idle message.

void addToStopping(boolean scheduleIdle, boolean idleDelayed, String reason) {
    
    
    .......
    // sheculeIdle为true
    if (scheduleIdle || forceIdle) {
    
    
    ProtoLog.v(WM_DEBUG_STATES,
               "Scheduling idle now: forceIdle=%b immediate=%b", forceIdle, !idleDelayed);
    //idleDelayed为false
    if (!idleDelayed) {
    
    
        mTaskSupervisor.scheduleIdle();
    } else {
    
    
        mTaskSupervisor.scheduleIdleTimeout(this);
    }
} else {
    
    
    rootTask.checkReadyForSleep();
}
}

IDLE_NOW_MSG - conditional send

In the scheduleProcessStoppingAndFinishingActivitiesIfNeeded method, you can also try to send if the following conditions are met:

  1. mStoppingActivities There are activities to be stopped
  2. All resumed activities are in the idle state
    void scheduleProcessStoppingAndFinishingActivitiesIfNeeded() {
    
    
        // 首先上个页面应该执行了addToStoppping方法,不然这里会直接返回
        if (mStoppingActivities.isEmpty() && mFinishingActivities.isEmpty()) {
    
    
            return;
        }
        // 上个页面所在app应回调了activityIdle方法,否则进不去这个if语句
        if (mRootWindowContainer.allResumedActivitiesIdle()) {
    
    
            // 尝试发送idle消息到dislay线程
            scheduleIdle();
            return;
        }
        // 如果下个页面处于visible状态,会发送PROCESS_STOPPING_AND_FINISHING_MSG消息
        if (!mHandler.hasMessages(PROCESS_STOPPING_AND_FINISHING_MSG)
                && mRootWindowContainer.allResumedActivitiesVisible()) {
    
    
            mHandler.sendEmptyMessage(PROCESS_STOPPING_AND_FINISHING_MSG);
        }
    }

Send PROCESS_STOPPING_AND_FINISHING_MSG message

As above, if the idle condition is not met in scheduleProcessStoppingAndFinishingActivitiesIfNeeded, but all resume pages are visible; a PROCESS_STOPPING_AND_FINISHING_MSG message can be sent

Send IDLE_TIMEOUT_MSG timeout message

Send a 10s delay message when the page resumes on the system server side to prevent time-consuming operations in the app main thread life cycle method from causing idle or visible in time.

    private static final int IDLE_TIMEOUT = 10 * 1000 * Build.HW_TIMEOUT_MULTIPLIER;
	void scheduleIdleTimeout(ActivityRecord next) {
    
    
        if (DEBUG_IDLE) Slog.d(TAG_IDLE, "scheduleIdleTimeout: Callers=" + Debug.getCallers(4));
        Message msg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG, next);
        mHandler.sendMessageDelayed(msg, IDLE_TIMEOUT);
    }

Relevant conditions are established

1. The Stopping list is not empty

    void addToStopping(boolean scheduleIdle, boolean idleDelayed, String reason) {
    
    
        if (!mTaskSupervisor.mStoppingActivities.contains(this)) {
    
    
            EventLogTags.writeWmAddToStopping(mUserId, System.identityHashCode(this),
                    shortComponentName, reason);
            mTaskSupervisor.mStoppingActivities.add(this);
        }
        ......
    }

2-1. Resume Activity is in idle state

    void activityIdleInternal(ActivityRecord r, boolean fromTimeout,
            boolean processPausingActivities, Configuration config) {
    
    
        if (DEBUG_ALL) Slog.v(TAG, "Activity idle: " + r);
    	// 只有app回调过来的binder线程的r才不为null,display线程执行message不会进下面if语句
        if (r != null) {
    
    
            if (DEBUG_IDLE) Slog.d(TAG_IDLE, "activityIdleInternal: Callers="
                    + Debug.getCallers(4));
            mHandler.removeMessages(IDLE_TIMEOUT_MSG, r);
            r.finishLaunchTickingLocked();
            if (fromTimeout) {
    
    
                reportActivityLaunched(fromTimeout, r, INVALID_DELAY, -1 /* launchState */);
            }

            // This is a hack to semi-deal with a race condition
            // in the client where it can be constructed with a
            // newer configuration from when we asked it to launch.
            // We'll update with whatever configuration it now says
            // it used to launch.
            if (config != null) {
    
    
                r.setLastReportedGlobalConfiguration(config);
            }
        	// 设置当前Activity idle状态为true
            // We are now idle.  If someone is waiting for a thumbnail from
            // us, we can now deliver.
            r.idle = true;

            // Check if able to finish booting when device is booting and all resumed activities
            // are idle.
            if ((mService.isBooting() && mRootWindowContainer.allResumedActivitiesIdle())
                    || fromTimeout) {
    
    
                checkFinishBootingLocked();
            }

            // When activity is idle, we consider the relaunch must be successful, so let's clear
            // the flag.
            r.mRelaunchReason = RELAUNCH_REASON_NONE;
        }
        ......
    }

    boolean allResumedActivitiesIdle() {
    
    
        for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) {
    
    
            // TODO(b/117135575): Check resumed activities on all visible root tasks.
            final DisplayContent display = getChildAt(displayNdx);
            if (display.isSleeping()) {
    
    
                // No resumed activities while display is sleeping.
                continue;
            }

            // If the focused root task is not null or not empty, there should have some activities
            // resuming or resumed. Make sure these activities are idle.
            final Task rootTask = display.getFocusedRootTask();
            if (rootTask == null || !rootTask.hasActivity()) {
    
    
                continue;
            }
            // 获取top resume页面并查看idle是否为true
            final ActivityRecord resumedActivity = rootTask.getTopResumedActivity();
            if (resumedActivity == null || !resumedActivity.idle) {
    
    
                ProtoLog.d(WM_DEBUG_STATES, "allResumedActivitiesIdle: rootTask=%d %s "
                        + "not idle", rootTask.getRootTaskId(), resumedActivity);
                return false;
            }
        }
        // End power mode launch when idle.
        mService.endLaunchPowerMode(ActivityTaskManagerService.POWER_MODE_REASON_START_ACTIVITY);
        return true;
    }

2-2. Or Resume Activity window Visible

    /** Called when the windows associated app window container are visible. */
    void onWindowsVisible() {
    
    
        if (DEBUG_VISIBILITY) Slog.v(TAG_WM, "Reporting visible in " + token);
        mTaskSupervisor.stopWaitingForActivityVisible(this);
        if (DEBUG_SWITCH) Log.v(TAG_SWITCH, "windowsVisibleLocked(): " + this);
        if (!nowVisible) {
    
    
            // 设置当前Activity窗口可见
            nowVisible = true;
            launching = false;
            lastVisibleTime = SystemClock.uptimeMillis();
            mAtmService.scheduleAppGcsLocked();
            // The nowVisible may be false in onAnimationFinished because the transition animation
            // was started by starting window but the main window hasn't drawn so the procedure
            // didn't schedule. Hence also check when nowVisible becomes true (drawn) to avoid the
            // closing activity having to wait until idle timeout to be stopped or destroyed if the
            // next activity won't report idle (e.g. repeated view animation).
            mTaskSupervisor.scheduleProcessStoppingAndFinishingActivitiesIfNeeded();
            // If the activity is visible, but no windows are eligible to start input, unfreeze
            // to avoid permanently frozen IME insets.
            if (mImeInsetsFrozenUntilStartInput && getWindow(
                    win -> WindowManager.LayoutParams.mayUseInputMethod(win.mAttrs.flags))
                    == null) {
    
    
                mImeInsetsFrozenUntilStartInput = false;
            }
        }
    }
    boolean allResumedActivitiesVisible() {
    
    
        boolean[] foundResumed = {
    
    false};
        final boolean foundInvisibleResumedActivity = forAllRootTasks(rootTask -> {
    
    
            final ActivityRecord r = rootTask.getTopResumedActivity();
            if (r != null) {
    
    
                if (!r.nowVisible) {
    
    
                    return true;
                }
                foundResumed[0] = true;
            }
            return false;
        });
        if (foundInvisibleResumedActivity) {
    
    
            return false;
        }
        return foundResumed[0];
    }

2-3. Or the 10s timeout time has come

animation end

How to judge that ActivityRecord is performing animation

    private OnAnimationFinishedCallback getFinishedCallback(
            @Nullable OnAnimationFinishedCallback staticAnimationFinishedCallback) {
    
    
        return (type, anim) -> {
    
    
            synchronized (mService.mGlobalLock) {
    
    
                final SurfaceAnimator target = mService.mAnimationTransferMap.remove(anim);
                if (target != null) {
    
    
                    target.mInnerAnimationFinishedCallback.onAnimationFinished(type, anim);
                    return;
                }

                if (anim != mAnimation) {
    
    
                    return;
                }
                final Runnable resetAndInvokeFinish = () -> {
    
    
                    // We need to check again if the animation has been replaced with a new
                    // animation because the animatable may defer to finish.
                    if (anim != mAnimation) {
    
    
                        return;
                    }
                    final OnAnimationFinishedCallback animationFinishCallback =
                            mSurfaceAnimationFinishedCallback;
                    // 1. 设置mAnimation为null
                    reset(mAnimatable.getSyncTransaction(), true /* destroyLeash */);
;				    // 回调ActivityRecord的onAnimationFinished
                    if (staticAnimationFinishedCallback != null) {
    
    
                        staticAnimationFinishedCallback.onAnimationFinished(type, anim);
                    }
                    if (animationFinishCallback != null) {
    
    
                        animationFinishCallback.onAnimationFinished(type, anim);
                    }
                };
                // If both the Animatable and AnimationAdapter requests to be deferred, only the
                // first one will be called.
                if (!(mAnimatable.shouldDeferAnimationFinish(resetAndInvokeFinish)
                        || anim.shouldDeferAnimationFinish(resetAndInvokeFinish))) {
    
    
                    resetAndInvokeFinish.run();
                }
                mAnimationFinished = true;
            }
        };
    }

common scene

The same App enters a new page

insert image description here

Prepare animation

Breakpoint reached
	at com.android.server.wm.AppTransition.prepareAppTransition(AppTransition.java:1596)
	at com.android.server.wm.DisplayContent.prepareAppTransition(DisplayContent.java:5605)
	at com.android.server.wm.DisplayContent.prepareAppTransition(DisplayContent.java:5596)
	at com.android.server.wm.TaskFragment.resumeTopActivity(TaskFragment.java:1455)
	at com.android.server.wm.Task.resumeTopActivityInnerLocked(Task.java:5602)
	at com.android.server.wm.Task.resumeTopActivityUncheckedLocked(Task.java:5530)
	at com.android.server.wm.RootWindowContainer.resumeFocusedTasksTopActivities(RootWindowContainer.java:2417)
	at com.android.server.wm.RootWindowContainer.resumeFocusedTasksTopActivities(RootWindowContainer.java:2403)
	at com.android.server.wm.TaskFragment.completePause(TaskFragment.java:1908)
	at com.android.server.wm.ActivityRecord.activityPaused(ActivityRecord.java:6673)
	at com.android.server.wm.ActivityClientController.activityPaused(ActivityClientController.java:191)
	at android.app.IActivityClientController$Stub.onTransact(IActivityClientController.java:582)
	at com.android.server.wm.ActivityClientController.onTransact(ActivityClientController.java:131)
	at android.os.Binder.execTransactInternal(Binder.java:1285)
	at android.os.Binder.execTransact(Binder.java:1249)
binder:3110_20 -> add mNextAppTransitionRequests
    
Breakpoint reached
	at com.android.server.wm.ActivityRecord.setVisibility(ActivityRecord.java:5650)
	at com.android.server.wm.ActivityRecord.setVisibility(ActivityRecord.java:5500)
	at com.android.server.wm.ActivityRecord.makeInvisible(ActivityRecord.java:6403)
	at com.android.server.wm.EnsureActivitiesVisibleHelper.setActivityVisibilityState(EnsureActivitiesVisibleHelper.java:239)
	at com.android.server.wm.EnsureActivitiesVisibleHelper.process(EnsureActivitiesVisibleHelper.java:143)
	at com.android.server.wm.TaskFragment.updateActivityVisibilities(TaskFragment.java:1153)
	at com.android.server.wm.Task.lambda$ensureActivitiesVisible$20(Task.java:5426)
	at com.android.server.wm.Task$$ExternalSyntheticLambda23.accept(D8$$SyntheticClass:-1)
	at com.android.server.wm.Task.forAllLeafTasks(Task.java:3590)
	at com.android.server.wm.Task.ensureActivitiesVisible(Task.java:5425)
	at com.android.server.wm.DisplayContent.lambda$ensureActivitiesVisible$45$com-android-server-wm-DisplayContent(DisplayContent.java:6468)
	at com.android.server.wm.DisplayContent$$ExternalSyntheticLambda38.accept(D8$$SyntheticClass:-1)
	at com.android.server.wm.Task.forAllRootTasks(Task.java:3602)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2117)
	at com.android.server.wm.DisplayContent.ensureActivitiesVisible(DisplayContent.java:6463)
	at com.android.server.wm.RootWindowContainer.ensureActivitiesVisible(RootWindowContainer.java:1911)
	at com.android.server.wm.RootWindowContainer.ensureVisibilityAndConfig(RootWindowContainer.java:1780)
	at com.android.server.wm.ActivityTaskSupervisor.realStartActivityLocked(ActivityTaskSupervisor.java:883)
	at com.android.server.wm.ActivityTaskSupervisor.startSpecificActivity(ActivityTaskSupervisor.java:1136)
	at com.android.server.wm.TaskFragment.resumeTopActivity(TaskFragment.java:1643)
	at com.android.server.wm.Task.resumeTopActivityInnerLocked(Task.java:5602)
	at com.android.server.wm.Task.resumeTopActivityUncheckedLocked(Task.java:5530)
	at com.android.server.wm.RootWindowContainer.resumeFocusedTasksTopActivities(RootWindowContainer.java:2417)
	at com.android.server.wm.RootWindowContainer.resumeFocusedTasksTopActivities(RootWindowContainer.java:2403)
	at com.android.server.wm.TaskFragment.completePause(TaskFragment.java:1908)
	at com.android.server.wm.ActivityRecord.activityPaused(ActivityRecord.java:6673)
	at com.android.server.wm.ActivityClientController.activityPaused(ActivityClientController.java:191)
	at android.app.IActivityClientController$Stub.onTransact(IActivityClientController.java:582)
	at com.android.server.wm.ActivityClientController.onTransact(ActivityClientController.java:131)
	at android.os.Binder.execTransactInternal(Binder.java:1285)
	at android.os.Binder.execTransact(Binder.java:1249)
binder:3110_20 -> add mClosingApps

addToStopping and send idle message

Breakpoint reached
	at com.android.server.wm.ActivityTaskSupervisor.scheduleIdle(ActivityTaskSupervisor.java:2305)
	at com.android.server.wm.ActivityRecord.addToStopping(ActivityRecord.java:6858)
	at com.android.server.wm.ActivityRecord.makeInvisible(ActivityRecord.java:6417)
	at com.android.server.wm.EnsureActivitiesVisibleHelper.setActivityVisibilityState(EnsureActivitiesVisibleHelper.java:239)
	at com.android.server.wm.EnsureActivitiesVisibleHelper.process(EnsureActivitiesVisibleHelper.java:143)
	at com.android.server.wm.TaskFragment.updateActivityVisibilities(TaskFragment.java:1153)
	at com.android.server.wm.Task.lambda$ensureActivitiesVisible$20(Task.java:5426)
	at com.android.server.wm.Task$$ExternalSyntheticLambda23.accept(D8$$SyntheticClass:-1)
	at com.android.server.wm.Task.forAllLeafTasks(Task.java:3590)
	at com.android.server.wm.Task.ensureActivitiesVisible(Task.java:5425)
	at com.android.server.wm.DisplayContent.lambda$ensureActivitiesVisible$45$com-android-server-wm-DisplayContent(DisplayContent.java:6468)
	at com.android.server.wm.DisplayContent$$ExternalSyntheticLambda38.accept(D8$$SyntheticClass:-1)
	at com.android.server.wm.Task.forAllRootTasks(Task.java:3602)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2117)
	at com.android.server.wm.DisplayContent.ensureActivitiesVisible(DisplayContent.java:6463)
	at com.android.server.wm.RootWindowContainer.ensureActivitiesVisible(RootWindowContainer.java:1911)
	at com.android.server.wm.RootWindowContainer.ensureVisibilityAndConfig(RootWindowContainer.java:1780)
	at com.android.server.wm.ActivityTaskSupervisor.realStartActivityLocked(ActivityTaskSupervisor.java:883)
	at com.android.server.wm.ActivityTaskSupervisor.startSpecificActivity(ActivityTaskSupervisor.java:1136)
	at com.android.server.wm.TaskFragment.resumeTopActivity(TaskFragment.java:1643)
	at com.android.server.wm.Task.resumeTopActivityInnerLocked(Task.java:5602)
	at com.android.server.wm.Task.resumeTopActivityUncheckedLocked(Task.java:5530)
	at com.android.server.wm.RootWindowContainer.resumeFocusedTasksTopActivities(RootWindowContainer.java:2417)
	at com.android.server.wm.RootWindowContainer.resumeFocusedTasksTopActivities(RootWindowContainer.java:2403)
	at com.android.server.wm.TaskFragment.completePause(TaskFragment.java:1908)
	at com.android.server.wm.ActivityRecord.activityPaused(ActivityRecord.java:6673)
	at com.android.server.wm.ActivityClientController.activityPaused(ActivityClientController.java:191)
	at android.app.IActivityClientController$Stub.onTransact(IActivityClientController.java:582)
	at com.android.server.wm.ActivityClientController.onTransact(ActivityClientController.java:131)
	at android.os.Binder.execTransactInternal(Binder.java:1285)
	at android.os.Binder.execTransact(Binder.java:1249)
binder:3110_20 -> send IDLE_NOW_MSG

Execute IDLE_NOW_MSG message

Because the above Prepare animation is currently executed, isAnimating returns true, and the Stop process cannot be executed normally.

Breakpoint reached
	at com.android.server.wm.ActivityTaskSupervisor.processStoppingAndFinishingActivities(ActivityTaskSupervisor.java:2164)
	at com.android.server.wm.ActivityTaskSupervisor.activityIdleInternal(ActivityTaskSupervisor.java:1519)
	at com.android.server.wm.ActivityTaskSupervisor$ActivityTaskSupervisorHandler.activityIdleFromMessage(ActivityTaskSupervisor.java:2672)
	at com.android.server.wm.ActivityTaskSupervisor$ActivityTaskSupervisorHandler.handleMessageInner(ActivityTaskSupervisor.java:2705)
	at com.android.server.wm.ActivityTaskSupervisor$ActivityTaskSupervisorHandler.handleMessage(ActivityTaskSupervisor.java:2647)
	at android.os.Handler.dispatchMessage(Handler.java:106)
	at android.os.Looper.loopOnce(Looper.java:210)
	at android.os.Looper.loop(Looper.java:299)
	at android.os.HandlerThread.run(HandlerThread.java:67)
	at com.android.server.ServiceThread.run(ServiceThread.java:46)
android.display ->com.android.settings/.MainSettings  -> animating= true

start animation

// 设置mAnimation
Breakpoint reached
	at com.android.server.wm.SurfaceAnimator.startAnimation(SurfaceAnimator.java:172)
	at com.android.server.wm.WindowContainer.startAnimation(WindowContainer.java:2861)
	at com.android.server.wm.WindowContainer$AnimationRunnerBuilder.lambda$build$4$com-android-server-wm-WindowContainer$AnimationRunnerBuilder(WindowContainer.java:4192)
	at com.android.server.wm.WindowContainer$AnimationRunnerBuilder$$ExternalSyntheticLambda4.startAnimation(D8$$SyntheticClass:-1)
	at com.android.server.wm.WindowContainer.applyAnimationUnchecked(WindowContainer.java:3322)
	at com.android.server.wm.WindowContainer.applyAnimation(WindowContainer.java:3015)
	at com.android.server.wm.ActivityRecord.applyAnimation(ActivityRecord.java:5683)
	at com.android.server.wm.AppTransitionController.applyAnimations(AppTransitionController.java:865)
	at com.android.server.wm.AppTransitionController.applyAnimations(AppTransitionController.java:1072)
	at com.android.server.wm.AppTransitionController.handleAppTransitionReady(AppTransitionController.java:293)
	at com.android.server.wm.RootWindowContainer.checkAppTransitionReady(RootWindowContainer.java:998)
	at com.android.server.wm.RootWindowContainer.performSurfacePlacementNoTrace(RootWindowContainer.java:865)
	at com.android.server.wm.RootWindowContainer.performSurfacePlacement(RootWindowContainer.java:805)
	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacementLoop(WindowSurfacePlacer.java:199)
	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:148)
	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:137)
	at com.android.server.wm.WindowSurfacePlacer$Traverser.run(WindowSurfacePlacer.java:79)
	at android.os.Handler.handleCallback(Handler.java:942)
	at android.os.Handler.dispatchMessage(Handler.java:99)
	at android.os.Looper.loopOnce(Looper.java:210)
	at android.os.Looper.loop(Looper.java:299)
	at android.os.HandlerThread.run(HandlerThread.java:67)
	at com.android.server.ServiceThread.run(ServiceThread.java:46)
com.android.settings/.MainSettings

    // 清除mNextAppTransitionRequests
    Breakpoint reached
	at com.android.server.wm.AppTransition.goodToGo(AppTransition.java:391)
	at com.android.server.wm.AppTransitionController.handleAppTransitionReady(AppTransitionController.java:307)
	at com.android.server.wm.RootWindowContainer.checkAppTransitionReady(RootWindowContainer.java:998)
	at com.android.server.wm.RootWindowContainer.performSurfacePlacementNoTrace(RootWindowContainer.java:865)
	at com.android.server.wm.RootWindowContainer.performSurfacePlacement(RootWindowContainer.java:805)
	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacementLoop(WindowSurfacePlacer.java:199)
	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:148)
	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:137)
	at com.android.server.wm.WindowSurfacePlacer$Traverser.run(WindowSurfacePlacer.java:79)
	at android.os.Handler.handleCallback(Handler.java:942)
	at android.os.Handler.dispatchMessage(Handler.java:99)
	at android.os.Looper.loopOnce(Looper.java:210)
	at android.os.Looper.loop(Looper.java:299)
	at android.os.HandlerThread.run(HandlerThread.java:67)
	at com.android.server.ServiceThread.run(ServiceThread.java:46)
android.anim -> clear mNextAppTransitionRequests

    // 清除mClosingApps
    Breakpoint reached
	at com.android.server.wm.AppTransitionController.handleAppTransitionReady(AppTransitionController.java:318)
	at com.android.server.wm.RootWindowContainer.checkAppTransitionReady(RootWindowContainer.java:998)
	at com.android.server.wm.RootWindowContainer.performSurfacePlacementNoTrace(RootWindowContainer.java:865)
	at com.android.server.wm.RootWindowContainer.performSurfacePlacement(RootWindowContainer.java:805)
	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacementLoop(WindowSurfacePlacer.java:199)
	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:148)
	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:137)
	at com.android.server.wm.WindowSurfacePlacer$Traverser.run(WindowSurfacePlacer.java:79)
	at android.os.Handler.handleCallback(Handler.java:942)
	at android.os.Handler.dispatchMessage(Handler.java:99)
	at android.os.Looper.loopOnce(Looper.java:210)
	at android.os.Looper.loop(Looper.java:299)
	at android.os.HandlerThread.run(HandlerThread.java:67)
	at com.android.server.ServiceThread.run(ServiceThread.java:46)
android.anim -> clear mClosingApps

Set the resume page to idle state

The app calls back activityIdle, sets the current resume page to the idle state and tries to stop; because the animation has already started, isAnimating is still true, and the stop process cannot be performed

Breakpoint reached
	at com.android.server.wm.ActivityTaskSupervisor.processStoppingAndFinishingActivities(ActivityTaskSupervisor.java:2164)
	at com.android.server.wm.ActivityTaskSupervisor.activityIdleInternal(ActivityTaskSupervisor.java:1519)
	at com.android.server.wm.ActivityClientController.activityIdle(ActivityClientController.java:150)
	at android.app.IActivityClientController$Stub.onTransact(IActivityClientController.java:558)
	at com.android.server.wm.ActivityClientController.onTransact(ActivityClientController.java:131)
	at android.os.Binder.execTransactInternal(Binder.java:1290)
	at android.os.Binder.execTransact(Binder.java:1249)
binder:3110_16 ->com.android.settings/.MainSettings  -> animating= true

The current resume page animation ends & the window is visible

Because the above mStoppingActivities is not empty & allResumedActivitiesIdle & the message queue has no IDLE_NOW_MSG message, so the message is sent successfully

// 当前resume页面窗口可见并尝试发送idle消息
Breakpoint reached
	at com.android.server.wm.ActivityTaskSupervisor.scheduleIdle(ActivityTaskSupervisor.java:2305)
	at com.android.server.wm.ActivityTaskSupervisor.scheduleProcessStoppingAndFinishingActivitiesIfNeeded(ActivityTaskSupervisor.java:2411)
	at com.android.server.wm.ActivityRecord.onWindowsVisible(ActivityRecord.java:7160)
	at com.android.server.wm.ActivityRecord.updateReportedVisibilityLocked(ActivityRecord.java:7276)
	at com.android.server.wm.WindowManagerService$4.onAppTransitionFinishedLocked(WindowManagerService.java:1298)
	at com.android.server.wm.AppTransition.notifyAppTransitionFinishedLocked(AppTransition.java:500)
	at com.android.server.wm.ActivityRecord.onAnimationFinished(ActivityRecord.java:8218)
	at com.android.server.wm.WindowContainer$$ExternalSyntheticLambda4.onAnimationFinished(D8$$SyntheticClass:-1)
	at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$0$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:133)
	at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda1.run(D8$$SyntheticClass:-1)
	at com.android.server.wm.AnimatingActivityRegistry.endDeferringFinished(AnimatingActivityRegistry.java:104)
	at com.android.server.wm.AnimatingActivityRegistry.notifyAboutToFinish(AnimatingActivityRegistry.java:77)
	at com.android.server.wm.ActivityRecord.shouldDeferAnimationFinish(ActivityRecord.java:7921)
	at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$1$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:141)
	at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda0.onAnimationFinished(D8$$SyntheticClass:-1)
	at com.android.server.wm.LocalAnimationAdapter.lambda$startAnimation$0$com-android-server-wm-LocalAnimationAdapter(LocalAnimationAdapter.java:67)
	at com.android.server.wm.LocalAnimationAdapter$$ExternalSyntheticLambda0.run(D8$$SyntheticClass:-1)
	at android.os.Handler.handleCallback(Handler.java:942)
	at android.os.Handler.dispatchMessage(Handler.java:99)
	at android.os.Looper.loopOnce(Looper.java:210)
	at android.os.Looper.loop(Looper.java:299)
	at android.os.HandlerThread.run(HandlerThread.java:67)
	at com.android.server.ServiceThread.run(ServiceThread.java:46)
android.anim -> com.android.settings/.SubSettings -> true
android.anim -> send IDLE_NOW_MSG

    // onAnimationFinished尝试发送消息,因为同步上面堆栈已经发送成功了,所以这里不必再次发送
   Breakpoint reached
	at com.android.server.wm.ActivityTaskSupervisor.scheduleIdle(ActivityTaskSupervisor.java:2305)
	at com.android.server.wm.ActivityTaskSupervisor.scheduleProcessStoppingAndFinishingActivitiesIfNeeded(ActivityTaskSupervisor.java:2411)
	at com.android.server.wm.ActivityRecord.onAnimationFinished(ActivityRecord.java:8223)
	at com.android.server.wm.WindowContainer$$ExternalSyntheticLambda4.onAnimationFinished(D8$$SyntheticClass:-1)
	at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$0$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:133)
	at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda1.run(D8$$SyntheticClass:-1)
	at com.android.server.wm.AnimatingActivityRegistry.endDeferringFinished(AnimatingActivityRegistry.java:104)
	at com.android.server.wm.AnimatingActivityRegistry.notifyAboutToFinish(AnimatingActivityRegistry.java:77)
	at com.android.server.wm.ActivityRecord.shouldDeferAnimationFinish(ActivityRecord.java:7921)
	at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$1$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:141)
	at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda0.onAnimationFinished(D8$$SyntheticClass:-1)
	at com.android.server.wm.LocalAnimationAdapter.lambda$startAnimation$0$com-android-server-wm-LocalAnimationAdapter(LocalAnimationAdapter.java:67)
	at com.android.server.wm.LocalAnimationAdapter$$ExternalSyntheticLambda0.run(D8$$SyntheticClass:-1)
	at android.os.Handler.handleCallback(Handler.java:942)
	at android.os.Handler.dispatchMessage(Handler.java:99)
	at android.os.Looper.loopOnce(Looper.java:210)
	at android.os.Looper.loop(Looper.java:299)
	at android.os.HandlerThread.run(HandlerThread.java:67)
	at com.android.server.ServiceThread.run(ServiceThread.java:46)
android.anim 
    android.anim -> com.android.settings/.SubSettings -> true

Last exit page animation ended

Call back the onAnimationFinished of ActivityRecord, because the IDLE_NOW_MSG message already exists above, so there is no need to send it repeatedly

// 设置mAnimation为null
Breakpoint reached
	at com.android.server.wm.SurfaceAnimator.reset(SurfaceAnimator.java:402)
	at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$0$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:131)
	at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda1.run(D8$$SyntheticClass:-1)
	at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$1$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:143)
	at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda0.onAnimationFinished(D8$$SyntheticClass:-1)
	at com.android.server.wm.LocalAnimationAdapter.lambda$startAnimation$0$com-android-server-wm-LocalAnimationAdapter(LocalAnimationAdapter.java:67)
	at com.android.server.wm.LocalAnimationAdapter$$ExternalSyntheticLambda0.run(D8$$SyntheticClass:-1)
	at android.os.Handler.handleCallback(Handler.java:942)
	at android.os.Handler.dispatchMessage(Handler.java:99)
	at android.os.Looper.loopOnce(Looper.java:210)
	at android.os.Looper.loop(Looper.java:299)
	at android.os.HandlerThread.run(HandlerThread.java:67)
	at com.android.server.ServiceThread.run(ServiceThread.java:46)
com.android.settings/.MainSettings
   // 回调ActivityRecord的 onAnimationFinished,因为上面已经存在IDLE_NOW_MSG消息,所以不必重复发送
Breakpoint reached
	at com.android.server.wm.ActivityTaskSupervisor.scheduleIdle(ActivityTaskSupervisor.java:2305)
	at com.android.server.wm.ActivityTaskSupervisor.scheduleProcessStoppingAndFinishingActivitiesIfNeeded(ActivityTaskSupervisor.java:2411)
	at com.android.server.wm.ActivityRecord.onAnimationFinished(ActivityRecord.java:8223)
	at com.android.server.wm.WindowContainer$$ExternalSyntheticLambda4.onAnimationFinished(D8$$SyntheticClass:-1)
	at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$0$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:133)
	at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda1.run(D8$$SyntheticClass:-1)
	at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$1$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:143)
	at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda0.onAnimationFinished(D8$$SyntheticClass:-1)
	at com.android.server.wm.LocalAnimationAdapter.lambda$startAnimation$0$com-android-server-wm-LocalAnimationAdapter(LocalAnimationAdapter.java:67)
	at com.android.server.wm.LocalAnimationAdapter$$ExternalSyntheticLambda0.run(D8$$SyntheticClass:-1)
	at android.os.Handler.handleCallback(Handler.java:942)
	at android.os.Handler.dispatchMessage(Handler.java:99)
	at android.os.Looper.loopOnce(Looper.java:210)
	at android.os.Looper.loop(Looper.java:299)
	at android.os.HandlerThread.run(HandlerThread.java:67)
	at com.android.server.ServiceThread.run(ServiceThread.java:46)
android.anim -> com.android.settings/.MainSettings -> false

execute idle message

Because the last exit page animation ended, the Stop process can be executed

Breakpoint reached
	at com.android.server.wm.ActivityTaskSupervisor.processStoppingAndFinishingActivities(ActivityTaskSupervisor.java:2164)
	at com.android.server.wm.ActivityTaskSupervisor.activityIdleInternal(ActivityTaskSupervisor.java:1519)
	at com.android.server.wm.ActivityTaskSupervisor$ActivityTaskSupervisorHandler.activityIdleFromMessage(ActivityTaskSupervisor.java:2672)
	at com.android.server.wm.ActivityTaskSupervisor$ActivityTaskSupervisorHandler.handleMessageInner(ActivityTaskSupervisor.java:2705)
	at com.android.server.wm.ActivityTaskSupervisor$ActivityTaskSupervisorHandler.handleMessage(ActivityTaskSupervisor.java:2647)
	at android.os.Handler.dispatchMessage(Handler.java:106)
	at android.os.Looper.loopOnce(Looper.java:210)
	at android.os.Looper.loop(Looper.java:299)
	at android.os.HandlerThread.run(HandlerThread.java:67)
	at com.android.server.ServiceThread.run(ServiceThread.java:46)
android.display ->com.android.settings/.MainSettings  -> animating= false

Enter the App from the desktop

insert image description here

The same scenario as above will no longer enumerate the stack

Prepare animation (same)

addToStopping and send idle message (same)

start animation

Roughly the same as the above scene, here is the animation of Task

// 设置mAnimation,这里是Task类型
Breakpoint reached
	at com.android.server.wm.SurfaceAnimator.startAnimation(SurfaceAnimator.java:172)
	at com.android.server.wm.WindowContainer.startAnimation(WindowContainer.java:2861)
	at com.android.server.wm.WindowContainer$AnimationRunnerBuilder.lambda$build$4$com-android-server-wm-WindowContainer$AnimationRunnerBuilder(WindowContainer.java:4192)
	at com.android.server.wm.WindowContainer$AnimationRunnerBuilder$$ExternalSyntheticLambda4.startAnimation(D8$$SyntheticClass:-1)
	at com.android.server.wm.WindowContainer.applyAnimationUnchecked(WindowContainer.java:3322)
	at com.android.server.wm.Task.applyAnimationUnchecked(Task.java:3864)
	at com.android.server.wm.WindowContainer.applyAnimation(WindowContainer.java:3015)
	at com.android.server.wm.AppTransitionController.applyAnimations(AppTransitionController.java:865)
	at com.android.server.wm.AppTransitionController.applyAnimations(AppTransitionController.java:1072)
	at com.android.server.wm.AppTransitionController.handleAppTransitionReady(AppTransitionController.java:293)
	at com.android.server.wm.RootWindowContainer.checkAppTransitionReady(RootWindowContainer.java:998)
	at com.android.server.wm.RootWindowContainer.performSurfacePlacementNoTrace(RootWindowContainer.java:865)
	at com.android.server.wm.RootWindowContainer.performSurfacePlacement(RootWindowContainer.java:805)
	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacementLoop(WindowSurfacePlacer.java:199)
	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:148)
	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:137)
	at com.android.server.wm.WindowSurfacePlacer$Traverser.run(WindowSurfacePlacer.java:79)
	at android.os.Handler.handleCallback(Handler.java:942)
	at android.os.Handler.dispatchMessage(Handler.java:99)
	at android.os.Looper.loopOnce(Looper.java:210)
	at android.os.Looper.loop(Looper.java:299)
	at android.os.HandlerThread.run(HandlerThread.java:67)
	at com.android.server.ServiceThread.run(ServiceThread.java:46)
Task{
    
    2aa5333 #7 type=home ?? U=0 visible=false visibleRequested=false mode=fullscreen translucent=true sz=1}
    
    // 清除mNextAppTransitionRequests
Breakpoint reached
	at com.android.server.wm.AppTransition.goodToGo(AppTransition.java:391)
	at com.android.server.wm.AppTransitionController.handleAppTransitionReady(AppTransitionController.java:307)
	at com.android.server.wm.RootWindowContainer.checkAppTransitionReady(RootWindowContainer.java:998)
	at com.android.server.wm.RootWindowContainer.performSurfacePlacementNoTrace(RootWindowContainer.java:865)
	at com.android.server.wm.RootWindowContainer.performSurfacePlacement(RootWindowContainer.java:805)
	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacementLoop(WindowSurfacePlacer.java:199)
	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:148)
	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:137)
	at com.android.server.wm.WindowSurfacePlacer$Traverser.run(WindowSurfacePlacer.java:79)
	at android.os.Handler.handleCallback(Handler.java:942)
	at android.os.Handler.dispatchMessage(Handler.java:99)
	at android.os.Looper.loopOnce(Looper.java:210)
	at android.os.Looper.loop(Looper.java:299)
	at android.os.HandlerThread.run(HandlerThread.java:67)
	at com.android.server.ServiceThread.run(ServiceThread.java:46)
android.anim -> clear mNextAppTransitionRequests

    // 清除mClosingApps
Breakpoint reached
	at com.android.server.wm.AppTransitionController.handleAppTransitionReady(AppTransitionController.java:318)
	at com.android.server.wm.RootWindowContainer.checkAppTransitionReady(RootWindowContainer.java:998)
	at com.android.server.wm.RootWindowContainer.performSurfacePlacementNoTrace(RootWindowContainer.java:865)
	at com.android.server.wm.RootWindowContainer.performSurfacePlacement(RootWindowContainer.java:805)
	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacementLoop(WindowSurfacePlacer.java:199)
	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:148)
	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:137)
	at com.android.server.wm.WindowSurfacePlacer$Traverser.run(WindowSurfacePlacer.java:79)
	at android.os.Handler.handleCallback(Handler.java:942)
	at android.os.Handler.dispatchMessage(Handler.java:99)
	at android.os.Looper.loopOnce(Looper.java:210)
	at android.os.Looper.loop(Looper.java:299)
	at android.os.HandlerThread.run(HandlerThread.java:67)
	at com.android.server.ServiceThread.run(ServiceThread.java:46)
android.anim -> clear mClosingApps

Execute IDLE_NOW_MSG message

Because the above Start animation is currently executed, isAnimating returns true, and the Stop process cannot be executed normally.

Breakpoint reached
	at com.android.server.wm.ActivityTaskSupervisor.processStoppingAndFinishingActivities(ActivityTaskSupervisor.java:2164)
	at com.android.server.wm.ActivityTaskSupervisor.activityIdleInternal(ActivityTaskSupervisor.java:1519)
	at com.android.server.wm.ActivityTaskSupervisor$ActivityTaskSupervisorHandler.activityIdleFromMessage(ActivityTaskSupervisor.java:2672)
	at com.android.server.wm.ActivityTaskSupervisor$ActivityTaskSupervisorHandler.handleMessageInner(ActivityTaskSupervisor.java:2705)
	at com.android.server.wm.ActivityTaskSupervisor$ActivityTaskSupervisorHandler.handleMessage(ActivityTaskSupervisor.java:2647)
	at android.os.Handler.dispatchMessage(Handler.java:106)
	at android.os.Looper.loopOnce(Looper.java:210)
	at android.os.Looper.loop(Looper.java:299)
	at android.os.HandlerThread.run(HandlerThread.java:67)
	at com.android.server.ServiceThread.run(ServiceThread.java:46)
android.display ->com.miui.home/.launcher.Launcher  -> animating= true

The last exit page (Launcher) animation ends

  1. Cannot send _IDLE_NOW_MSG_ message because allResumedActivitiesIdle condition is not met
  2. AllResumedActivitiesVisible not satisfied, cannot send _PROCESS_STOPPING_AND_FINISHING_MSG_ message
// 设置mAnimation为null
Breakpoint reached
	at com.android.server.wm.SurfaceAnimator.reset(SurfaceAnimator.java:402)
	at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$0$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:131)
	at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda1.run(D8$$SyntheticClass:-1)
	at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$1$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:143)
	at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda0.onAnimationFinished(D8$$SyntheticClass:-1)
	at com.android.server.wm.RemoteAnimationController.onAnimationFinished(RemoteAnimationController.java:299)
	at com.android.server.wm.RemoteAnimationController.-$$Nest$monAnimationFinished(RemoteAnimationController.java:-1)
	at com.android.server.wm.RemoteAnimationController$FinishedCallback.onAnimationFinished(RemoteAnimationController.java:443)
	at android.view.IRemoteAnimationFinishedCallback$Stub.onTransact(IRemoteAnimationFinishedCallback.java:89)
	at android.os.Binder.execTransactInternal(Binder.java:1290)
	at android.os.Binder.execTransact(Binder.java:1249)
com.miui.home/.launcher.Launcher
    
   // 不满足条件,无法发送消息
Breakpoint reached
	at com.android.server.wm.ActivityTaskSupervisor.scheduleProcessStoppingAndFinishingActivitiesIfNeeded(ActivityTaskSupervisor.java:2414)
	at com.android.server.wm.ActivityRecord.onAnimationFinished(ActivityRecord.java:8223)
	at com.android.server.wm.WindowContainer.doAnimationFinished(WindowContainer.java:3509)
	at com.android.server.wm.WindowContainer.onAnimationFinished(WindowContainer.java:3524)
	at com.android.server.wm.WindowContainer$$ExternalSyntheticLambda4.onAnimationFinished(D8$$SyntheticClass:-1)
	at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$0$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:133)
	at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda1.run(D8$$SyntheticClass:-1)
	at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$1$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:143)
	at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda0.onAnimationFinished(D8$$SyntheticClass:-1)
	at com.android.server.wm.RemoteAnimationController.onAnimationFinished(RemoteAnimationController.java:299)
	at com.android.server.wm.RemoteAnimationController.-$$Nest$monAnimationFinished(RemoteAnimationController.java:-1)
	at com.android.server.wm.RemoteAnimationController$FinishedCallback.onAnimationFinished(RemoteAnimationController.java:443)
	at android.view.IRemoteAnimationFinishedCallback$Stub.onTransact(IRemoteAnimationFinishedCallback.java:89)
	at android.os.Binder.execTransactInternal(Binder.java:1290)
	at android.os.Binder.execTransact(Binder.java:1249)

The current resume page animation ends & the window is visible

The thread here is the binder thread, not that
the message cannot be sent when the anim animation ends, and the _PROCESS_STOPPING_AND_FINISHING_MSG_ message is sent when the window is visible

// 当前resume页面动画结束,尝试发送消息失败,原因同上
Breakpoint reached
	at com.android.server.wm.ActivityTaskSupervisor.scheduleProcessStoppingAndFinishingActivitiesIfNeeded(ActivityTaskSupervisor.java:2414)
	at com.android.server.wm.ActivityRecord.onAnimationFinished(ActivityRecord.java:8223)
	at com.android.server.wm.WindowContainer.doAnimationFinished(WindowContainer.java:3509)
	at com.android.server.wm.WindowContainer.onAnimationFinished(WindowContainer.java:3524)
	at com.android.server.wm.WindowContainer$$ExternalSyntheticLambda4.onAnimationFinished(D8$$SyntheticClass:-1)
	at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$0$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:133)
	at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda1.run(D8$$SyntheticClass:-1)
	at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$1$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:143)
	at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda0.onAnimationFinished(D8$$SyntheticClass:-1)
	at com.android.server.wm.RemoteAnimationController.onAnimationFinished(RemoteAnimationController.java:299)
	at com.android.server.wm.RemoteAnimationController.-$$Nest$monAnimationFinished(RemoteAnimationController.java:-1)
	at com.android.server.wm.RemoteAnimationController$FinishedCallback.onAnimationFinished(RemoteAnimationController.java:443)
	at android.view.IRemoteAnimationFinishedCallback$Stub.onTransact(IRemoteAnimationFinishedCallback.java:89)
	at android.os.Binder.execTransactInternal(Binder.java:1290)
	at android.os.Binder.execTransact(Binder.java:1249)

// 发送PROCESS_STOPPING_AND_FINISHING_MSG消息
Breakpoint reached
	at com.android.server.wm.ActivityTaskSupervisor.scheduleProcessStoppingAndFinishingActivitiesIfNeeded(ActivityTaskSupervisor.java:2414)
	at com.android.server.wm.ActivityRecord.onWindowsVisible(ActivityRecord.java:7160)
	at com.android.server.wm.ActivityRecord.updateReportedVisibilityLocked(ActivityRecord.java:7276)
	at com.android.server.wm.WindowStateAnimator.onAnimationFinished(WindowStateAnimator.java:207)
	at com.android.server.wm.WindowState.onAnimationFinished(WindowState.java:5669)
	at com.android.server.wm.WindowContainer$$ExternalSyntheticLambda4.onAnimationFinished(D8$$SyntheticClass:-1)
	at com.android.server.wm.SurfaceAnimator.cancelAnimation(SurfaceAnimator.java:371)
	at com.android.server.wm.SurfaceAnimator.cancelAnimation(SurfaceAnimator.java:267)
	at com.android.server.wm.WindowContainer.cancelAnimation(WindowContainer.java:2886)
	at com.android.server.wm.WindowState.lambda$removeIfPossible$3(WindowState.java:2656)
	at com.android.server.wm.WindowState$$ExternalSyntheticLambda0.apply(D8$$SyntheticClass:-1)
	at com.android.server.wm.WindowState.applyInOrderWithImeWindows(WindowState.java:5253)
	at com.android.server.wm.WindowState.forAllWindows(WindowState.java:5097)
	at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1720)
	at com.android.server.wm.WindowState.removeIfPossible(WindowState.java:2654)
	at com.android.server.wm.WindowState.removeIfPossible(WindowState.java:2640)
	at com.android.server.wm.WindowManagerService.removeWindow(WindowManagerService.java:2289)
	at com.android.server.wm.Session.remove(Session.java:233)
	at android.view.IWindowSession$Stub.onTransact(IWindowSession.java:694)
	at com.android.server.wm.Session.onTransact(Session.java:185)
	at android.os.Binder.execTransactInternal(Binder.java:1285)
	at android.os.Binder.execTransact(Binder.java:1249)
Thread[binder:3224_20,5,main] -> Send PROCESS_STOPPING_AND_FINISHING_MSG

Execute _PROCESS_STOPPING_AND_FINISHING_MSG_message

Because the last exit page animation ended, the Stop process can be executed

Breakpoint reached
	at com.android.server.wm.ActivityTaskSupervisor.processStoppingAndFinishingActivities(ActivityTaskSupervisor.java:2164)
	at com.android.server.wm.ActivityTaskSupervisor.-$$Nest$mprocessStoppingAndFinishingActivities(ActivityTaskSupervisor.java:-1)
	at com.android.server.wm.ActivityTaskSupervisor$ActivityTaskSupervisorHandler.handleMessageInner(ActivityTaskSupervisor.java:2727)
	at com.android.server.wm.ActivityTaskSupervisor$ActivityTaskSupervisorHandler.handleMessage(ActivityTaskSupervisor.java:2647)
	at android.os.Handler.dispatchMessage(Handler.java:106)
	at android.os.Looper.loopOnce(Looper.java:210)
	at android.os.Looper.loop(Looper.java:299)
	at android.os.HandlerThread.run(HandlerThread.java:67)
	at com.android.server.ServiceThread.run(ServiceThread.java:46)
android.display ->com.miui.home/.launcher.Launcher  -> animating= false

Set the resume page to idle state

The app calls back activityIdle and sets the current resume page to idle state; because the stoppping list is already empty

Breakpoint reached
	at com.android.server.wm.ActivityTaskSupervisor.activityIdleInternal(ActivityTaskSupervisor.java:1519)
	at com.android.server.wm.ActivityClientController.activityIdle(ActivityClientController.java:150)
	at android.app.IActivityClientController$Stub.onTransact(IActivityClientController.java:558)
	at com.android.server.wm.ActivityClientController.onTransact(ActivityClientController.java:131)
	at android.os.Binder.execTransactInternal(Binder.java:1290)
	at android.os.Binder.execTransact(Binder.java:1249)
binder:3110_16 ->com.android.settings/.MainSettings  -> animating= true

Return to desktop from App

insert image description here

start animation

Breakpoint reached
	at com.android.server.wm.SurfaceAnimator.startAnimation(SurfaceAnimator.java:172)
	at com.android.server.wm.WindowContainer.startAnimation(WindowContainer.java:2861)
	at com.android.server.wm.WindowContainer.startAnimation(WindowContainer.java:2868)
	at com.android.server.wm.RecentsAnimationController.addAnimation(RecentsAnimationController.java:609)
	at com.android.server.wm.RecentsAnimationController.initialize(RecentsAnimationController.java:545)
	at com.android.server.wm.WindowManagerService.initializeRecentsAnimation(WindowManagerService.java:3340)
	at com.android.server.wm.RecentsAnimation.startRecentsActivity(RecentsAnimation.java:265)
	at com.android.server.wm.RecentsAnimation.startRecentsActivity(RecentsAnimation.java:175)
	at com.android.server.wm.ActivityTaskManagerService.startRecentsActivity(ActivityTaskManagerService.java:1838)
	at android.app.IActivityTaskManager$Stub.onTransact(IActivityTaskManager.java:1399)
	at com.android.server.wm.ActivityTaskManagerService.onTransact(ActivityTaskManagerService.java:5514)
	at android.os.Binder.execTransactInternal(Binder.java:1290)
	at android.os.Binder.execTransact(Binder.java:1249)
Task{
    
    80249ba #178 type=standard A=10071:com.miui.gallery.home U=0 visible=true visibleRequested=true mode=fullscreen translucent=false sz=1}

The following list of operations: the two page animations end, the window is visible, addToStoppping, etc. are all performed synchronously after the execution of the recent animation ends

The last exit page Task animation ends

Task animation, triggered by RecentsAnimation.onAnimationFinished

Breakpoint reached
	at com.android.server.wm.SurfaceAnimator.reset(SurfaceAnimator.java:402)
	at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$0$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:131)
	at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda1.run(D8$$SyntheticClass:-1)
	at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$1$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:143)
	at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda0.onAnimationFinished(D8$$SyntheticClass:-1)
	at com.android.server.wm.RecentsAnimationController$TaskAnimationAdapter.onRemove(RecentsAnimationController.java:1407)
	at com.android.server.wm.RecentsAnimationController.removeAnimation(RecentsAnimationController.java:635)
	at com.android.server.wm.RecentsAnimationController.cleanupAnimation(RecentsAnimationController.java:1076)
	at com.android.server.wm.WindowManagerService.cleanupRecentsAnimation(WindowManagerService.java:3366)
	at com.android.server.wm.RecentsAnimation.lambda$finishAnimation$0$com-android-server-wm-RecentsAnimation(RecentsAnimation.java:325)
	at com.android.server.wm.RecentsAnimation$$ExternalSyntheticLambda2.run(D8$$SyntheticClass:-1)
	at com.android.server.wm.WindowManagerService.inSurfaceTransaction(WindowManagerService.java:8865)
	at com.android.server.wm.RecentsAnimation.finishAnimation(RecentsAnimation.java:320)
	at com.android.server.wm.RecentsAnimation.onAnimationFinished(RecentsAnimation.java:438)
	at com.android.server.wm.RecentsAnimationController$3.finish(RecentsAnimationController.java:319)
	at android.view.IRecentsAnimationController$Stub.onTransact(IRecentsAnimationController.java:299)
	at android.os.Binder.execTransactInternal(Binder.java:1290)
	at android.os.Binder.execTransact(Binder.java:1249)
    binder:3237_20 
Task{
    
    80249ba #178 type=standard A=10071:com.miui.gallery.home U=0 visible=true visibleRequested=true mode=fullscreen translucent=false sz=1}

The current resume desktop animation ends & the window is visible

RecentsAnimation.onAnimationFinished triggers
mStopping list is empty, no message is sent in scheduleProcessStoppingAndFinishingActivitiesIfNeeded

// binder线程桌面动画结束
Breakpoint reached
	at com.android.server.wm.SurfaceAnimator.reset(SurfaceAnimator.java:402)
	at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$0$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:131)
	at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda1.run(D8$$SyntheticClass:-1)
	at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$1$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:143)
	at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda0.onAnimationFinished(D8$$SyntheticClass:-1)
	at com.android.server.wm.RecentsAnimationController$TaskAnimationAdapter.onRemove(RecentsAnimationController.java:1407)
	at com.android.server.wm.RecentsAnimationController.removeAnimation(RecentsAnimationController.java:635)
	at com.android.server.wm.RecentsAnimationController.cleanupAnimation(RecentsAnimationController.java:1076)
	at com.android.server.wm.WindowManagerService.cleanupRecentsAnimation(WindowManagerService.java:3366)
	at com.android.server.wm.RecentsAnimation.lambda$finishAnimation$0$com-android-server-wm-RecentsAnimation(RecentsAnimation.java:325)
	at com.android.server.wm.RecentsAnimation$$ExternalSyntheticLambda2.run(D8$$SyntheticClass:-1)
	at com.android.server.wm.WindowManagerService.inSurfaceTransaction(WindowManagerService.java:8865)
	at com.android.server.wm.RecentsAnimation.finishAnimation(RecentsAnimation.java:320)
	at com.android.server.wm.RecentsAnimation.onAnimationFinished(RecentsAnimation.java:438)
	at com.android.server.wm.RecentsAnimationController$3.finish(RecentsAnimationController.java:319)
	at android.view.IRecentsAnimationController$Stub.onTransact(IRecentsAnimationController.java:299)
	at android.os.Binder.execTransactInternal(Binder.java:1290)
	at android.os.Binder.execTransact(Binder.java:1249)
Task{
    
    4568f09 #163 type=home I=com.miui.home/.launcher.Launcher U=0 rootTaskId=7 visible=true visibleRequested=true mode=fullscreen translucent=false sz=1}

// binder线程窗口可见
Breakpoint reached
	at com.android.server.wm.ActivityRecord.onWindowsVisible(ActivityRecord.java:7160)
	at com.android.server.wm.ActivityRecord.updateReportedVisibilityLocked(ActivityRecord.java:7276)
	at com.android.server.wm.WindowStateAnimator.onAnimationFinished(WindowStateAnimator.java:207)
	at com.android.server.wm.WindowState.onAnimationFinished(WindowState.java:5669)
	at com.android.server.wm.RecentsAnimationController.lambda$initialize$3(RecentsAnimationController.java:547)
	at com.android.server.wm.RecentsAnimationController$$ExternalSyntheticLambda6.accept(D8$$SyntheticClass:-1)
	at com.android.server.wm.WindowContainer$ForAllWindowsConsumerWrapper.apply(WindowContainer.java:2733)
	at com.android.server.wm.WindowContainer$ForAllWindowsConsumerWrapper.apply(WindowContainer.java:2723)
	at com.android.server.wm.WindowState.applyInOrderWithImeWindows(WindowState.java:5253)
	at com.android.server.wm.WindowState.forAllWindows(WindowState.java:5097)
	at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1720)
	at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1720)
	at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1737)
	at com.android.server.wm.RecentsAnimationController.lambda$initialize$4(RecentsAnimationController.java:546)
	at com.android.server.wm.RecentsAnimationController$$ExternalSyntheticLambda9.onAnimationFinished(D8$$SyntheticClass:-1)
	at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$0$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:136)
	at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda1.run(D8$$SyntheticClass:-1)
	at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$1$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:143)
	at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda0.onAnimationFinished(D8$$SyntheticClass:-1)
	at com.android.server.wm.RecentsAnimationController$TaskAnimationAdapter.onRemove(RecentsAnimationController.java:1407)
	at com.android.server.wm.RecentsAnimationController.removeAnimation(RecentsAnimationController.java:635)
	at com.android.server.wm.RecentsAnimationController.cleanupAnimation(RecentsAnimationController.java:1076)
	at com.android.server.wm.WindowManagerService.cleanupRecentsAnimation(WindowManagerService.java:3366)
	at com.android.server.wm.RecentsAnimation.lambda$finishAnimation$0$com-android-server-wm-RecentsAnimation(RecentsAnimation.java:325)
	at com.android.server.wm.RecentsAnimation$$ExternalSyntheticLambda2.run(D8$$SyntheticClass:-1)
	at com.android.server.wm.WindowManagerService.inSurfaceTransaction(WindowManagerService.java:8865)
	at com.android.server.wm.RecentsAnimation.finishAnimation(RecentsAnimation.java:320)
	at com.android.server.wm.RecentsAnimation.onAnimationFinished(RecentsAnimation.java:438)
	at com.android.server.wm.RecentsAnimationController$3.finish(RecentsAnimationController.java:319)
	at android.view.IRecentsAnimationController$Stub.onTransact(IRecentsAnimationController.java:299)
	at android.os.Binder.execTransactInternal(Binder.java:1290)
	at android.os.Binder.execTransact(Binder.java:1249)
binder:3237_10 -> com.miui.home/.launcher.Launcher -> false
    // 因为Stopping列表为null,所以不发送消息
binder:3237_10 -> mStoppingActivities is null

Prepare animation

RecentsAnimation.onAnimationFinished triggers
the end of the recent animation, add mNextAppTransitionRequests & mClosingApps

Breakpoint reached
	at com.android.server.wm.AppTransition.prepareAppTransition(AppTransition.java:1596)
	at com.android.server.wm.DisplayContent.prepareAppTransition(DisplayContent.java:5605)
	at com.android.server.wm.DisplayContent.prepareAppTransition(DisplayContent.java:5596)
	at com.android.server.wm.Task.moveTaskToFront(Task.java:6207)
	at com.android.server.wm.Task.moveTaskToFront(Task.java:6136)
	at com.android.server.wm.RecentsAnimation.lambda$finishAnimation$0$com-android-server-wm-RecentsAnimation(RecentsAnimation.java:353)
	at com.android.server.wm.RecentsAnimation$$ExternalSyntheticLambda2.run(D8$$SyntheticClass:-1)
	at com.android.server.wm.WindowManagerService.inSurfaceTransaction(WindowManagerService.java:8865)
	at com.android.server.wm.RecentsAnimation.finishAnimation(RecentsAnimation.java:320)
	at com.android.server.wm.RecentsAnimation.onAnimationFinished(RecentsAnimation.java:438)
	at com.android.server.wm.RecentsAnimationController$3.finish(RecentsAnimationController.java:319)
	at android.view.IRecentsAnimationController$Stub.onTransact(IRecentsAnimationController.java:299)
	at android.os.Binder.execTransactInternal(Binder.java:1290)
	at android.os.Binder.execTransact(Binder.java:1249)
binder:3237_20 -> add mNextAppTransitionRequests

Breakpoint reached
	at com.android.server.wm.ActivityRecord.setVisibility(ActivityRecord.java:5650)
	at com.android.server.wm.ActivityRecord.setVisibility(ActivityRecord.java:5500)
	at com.android.server.wm.ActivityRecord.makeInvisible(ActivityRecord.java:6403)
	at com.android.server.wm.EnsureActivitiesVisibleHelper.setActivityVisibilityState(EnsureActivitiesVisibleHelper.java:239)
	at com.android.server.wm.EnsureActivitiesVisibleHelper.process(EnsureActivitiesVisibleHelper.java:143)
	at com.android.server.wm.TaskFragment.updateActivityVisibilities(TaskFragment.java:1153)
	at com.android.server.wm.Task.lambda$ensureActivitiesVisible$20(Task.java:5426)
	at com.android.server.wm.Task$$ExternalSyntheticLambda23.accept(D8$$SyntheticClass:-1)
	at com.android.server.wm.Task.forAllLeafTasks(Task.java:3590)
	at com.android.server.wm.Task.ensureActivitiesVisible(Task.java:5425)
	at com.android.server.wm.DisplayContent.lambda$ensureActivitiesVisible$45$com-android-server-wm-DisplayContent(DisplayContent.java:6468)
	at com.android.server.wm.DisplayContent$$ExternalSyntheticLambda38.accept(D8$$SyntheticClass:-1)
	at com.android.server.wm.Task.forAllRootTasks(Task.java:3602)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2117)
	at com.android.server.wm.DisplayContent.ensureActivitiesVisible(DisplayContent.java:6463)
	at com.android.server.wm.RootWindowContainer.ensureActivitiesVisible(RootWindowContainer.java:1911)
	at com.android.server.wm.RootWindowContainer.ensureActivitiesVisible(RootWindowContainer.java:1892)
	at com.android.server.wm.TaskFragment.completePause(TaskFragment.java:1928)
	at com.android.server.wm.TaskFragment.startPausing(TaskFragment.java:1810)
	at com.android.server.wm.TaskFragment.startPausing(TaskFragment.java:1678)
	at com.android.server.wm.TaskDisplayArea.lambda$pauseBackTasks$7$com-android-server-wm-TaskDisplayArea(TaskDisplayArea.java:1394)
	at com.android.server.wm.TaskDisplayArea$$ExternalSyntheticLambda7.accept(D8$$SyntheticClass:-1)
	at com.android.server.wm.TaskFragment.forAllLeafTaskFragments(TaskFragment.java:1967)
	at com.android.server.wm.TaskDisplayArea.lambda$pauseBackTasks$8$com-android-server-wm-TaskDisplayArea(TaskDisplayArea.java:1387)
	at com.android.server.wm.TaskDisplayArea$$ExternalSyntheticLambda5.accept(D8$$SyntheticClass:-1)
	at com.android.server.wm.Task.forAllLeafTasks(Task.java:3590)
	at com.android.server.wm.WindowContainer.forAllLeafTasks(WindowContainer.java:2089)
	at com.android.server.wm.TaskDisplayArea.pauseBackTasks(TaskDisplayArea.java:1373)
	at com.android.server.wm.TaskFragment.resumeTopActivity(TaskFragment.java:1317)
	at com.android.server.wm.Task.resumeTopActivityInnerLocked(Task.java:5602)
	at com.android.server.wm.Task.resumeTopActivityUncheckedLocked(Task.java:5530)
	at com.android.server.wm.Task.resumeTopActivityUncheckedLocked(Task.java:5550)
	at com.android.server.wm.Task.resumeTopActivityUncheckedLocked(Task.java:5585)
	at com.android.server.wm.ActivityRecord.makeActiveIfNeeded(ActivityRecord.java:6440)
	at com.android.server.wm.RootWindowContainer.lambda$resumeFocusedTasksTopActivities$18(RootWindowContainer.java:2447)
	at com.android.server.wm.RootWindowContainer$$ExternalSyntheticLambda17.accept(D8$$SyntheticClass:-1)
	at com.android.server.wm.Task.forAllRootTasks(Task.java:3602)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2117)
	at com.android.server.wm.RootWindowContainer.resumeFocusedTasksTopActivities(RootWindowContainer.java:2425)
	at com.android.server.wm.RootWindowContainer.resumeFocusedTasksTopActivities(RootWindowContainer.java:2403)
	at com.android.server.wm.RootWindowContainer.resumeFocusedTasksTopActivities(RootWindowContainer.java:2398)
	at com.android.server.wm.Task.moveTaskToFront(Task.java:6235)
	at com.android.server.wm.Task.moveTaskToFront(Task.java:6136)
	at com.android.server.wm.RecentsAnimation.lambda$finishAnimation$0$com-android-server-wm-RecentsAnimation(RecentsAnimation.java:353)
	at com.android.server.wm.RecentsAnimation$$ExternalSyntheticLambda2.run(D8$$SyntheticClass:-1)
	at com.android.server.wm.WindowManagerService.inSurfaceTransaction(WindowManagerService.java:8865)
	at com.android.server.wm.RecentsAnimation.finishAnimation(RecentsAnimation.java:320)
	at com.android.server.wm.RecentsAnimation.onAnimationFinished(RecentsAnimation.java:438)
	at com.android.server.wm.RecentsAnimationController$3.finish(RecentsAnimationController.java:319)
	at android.view.IRecentsAnimationController$Stub.onTransact(IRecentsAnimationController.java:299)
	at android.os.Binder.execTransactInternal(Binder.java:1290)
	at android.os.Binder.execTransact(Binder.java:1249)
binder:3237_20 -> add mNextAppTransitionRequests
    

addToStopping and send idle message

RecentsAnimation.onAnimationFinished fires

Breakpoint reached
	at com.android.server.wm.ActivityTaskSupervisor.scheduleIdle(ActivityTaskSupervisor.java:2305)
	at com.android.server.wm.ActivityRecord.addToStopping(ActivityRecord.java:6858)
	at com.android.server.wm.ActivityRecord.makeInvisible(ActivityRecord.java:6417)
	at com.android.server.wm.EnsureActivitiesVisibleHelper.setActivityVisibilityState(EnsureActivitiesVisibleHelper.java:239)
	at com.android.server.wm.EnsureActivitiesVisibleHelper.process(EnsureActivitiesVisibleHelper.java:143)
	at com.android.server.wm.TaskFragment.updateActivityVisibilities(TaskFragment.java:1153)
	at com.android.server.wm.Task.lambda$ensureActivitiesVisible$20(Task.java:5426)
	at com.android.server.wm.Task$$ExternalSyntheticLambda23.accept(D8$$SyntheticClass:-1)
	at com.android.server.wm.Task.forAllLeafTasks(Task.java:3590)
	at com.android.server.wm.Task.ensureActivitiesVisible(Task.java:5425)
	at com.android.server.wm.DisplayContent.lambda$ensureActivitiesVisible$45$com-android-server-wm-DisplayContent(DisplayContent.java:6468)
	at com.android.server.wm.DisplayContent$$ExternalSyntheticLambda38.accept(D8$$SyntheticClass:-1)
	at com.android.server.wm.Task.forAllRootTasks(Task.java:3602)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2117)
	at com.android.server.wm.DisplayContent.ensureActivitiesVisible(DisplayContent.java:6463)
	at com.android.server.wm.RootWindowContainer.ensureActivitiesVisible(RootWindowContainer.java:1911)
	at com.android.server.wm.RootWindowContainer.ensureActivitiesVisible(RootWindowContainer.java:1892)
	at com.android.server.wm.TaskFragment.completePause(TaskFragment.java:1928)
	at com.android.server.wm.TaskFragment.startPausing(TaskFragment.java:1810)
	at com.android.server.wm.TaskFragment.startPausing(TaskFragment.java:1678)
	at com.android.server.wm.TaskDisplayArea.lambda$pauseBackTasks$7$com-android-server-wm-TaskDisplayArea(TaskDisplayArea.java:1394)
	at com.android.server.wm.TaskDisplayArea$$ExternalSyntheticLambda7.accept(D8$$SyntheticClass:-1)
	at com.android.server.wm.TaskFragment.forAllLeafTaskFragments(TaskFragment.java:1967)
	at com.android.server.wm.TaskDisplayArea.lambda$pauseBackTasks$8$com-android-server-wm-TaskDisplayArea(TaskDisplayArea.java:1387)
	at com.android.server.wm.TaskDisplayArea$$ExternalSyntheticLambda5.accept(D8$$SyntheticClass:-1)
	at com.android.server.wm.Task.forAllLeafTasks(Task.java:3590)
	at com.android.server.wm.WindowContainer.forAllLeafTasks(WindowContainer.java:2089)
	at com.android.server.wm.TaskDisplayArea.pauseBackTasks(TaskDisplayArea.java:1373)
	at com.android.server.wm.TaskFragment.resumeTopActivity(TaskFragment.java:1317)
	at com.android.server.wm.Task.resumeTopActivityInnerLocked(Task.java:5602)
	at com.android.server.wm.Task.resumeTopActivityUncheckedLocked(Task.java:5530)
	at com.android.server.wm.Task.resumeTopActivityUncheckedLocked(Task.java:5550)
	at com.android.server.wm.Task.resumeTopActivityUncheckedLocked(Task.java:5585)
	at com.android.server.wm.ActivityRecord.makeActiveIfNeeded(ActivityRecord.java:6440)
	at com.android.server.wm.RootWindowContainer.lambda$resumeFocusedTasksTopActivities$18(RootWindowContainer.java:2447)
	at com.android.server.wm.RootWindowContainer$$ExternalSyntheticLambda17.accept(D8$$SyntheticClass:-1)
	at com.android.server.wm.Task.forAllRootTasks(Task.java:3602)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
	at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2117)
	at com.android.server.wm.RootWindowContainer.resumeFocusedTasksTopActivities(RootWindowContainer.java:2425)
	at com.android.server.wm.RootWindowContainer.resumeFocusedTasksTopActivities(RootWindowContainer.java:2403)
	at com.android.server.wm.RootWindowContainer.resumeFocusedTasksTopActivities(RootWindowContainer.java:2398)
	at com.android.server.wm.Task.moveTaskToFront(Task.java:6235)
	at com.android.server.wm.Task.moveTaskToFront(Task.java:6136)
	at com.android.server.wm.RecentsAnimation.lambda$finishAnimation$0$com-android-server-wm-RecentsAnimation(RecentsAnimation.java:353)
	at com.android.server.wm.RecentsAnimation$$ExternalSyntheticLambda2.run(D8$$SyntheticClass:-1)
	at com.android.server.wm.WindowManagerService.inSurfaceTransaction(WindowManagerService.java:8865)
	at com.android.server.wm.RecentsAnimation.finishAnimation(RecentsAnimation.java:320)
	at com.android.server.wm.RecentsAnimation.onAnimationFinished(RecentsAnimation.java:438)
	at com.android.server.wm.RecentsAnimationController$3.finish(RecentsAnimationController.java:319)
	at android.view.IRecentsAnimationController$Stub.onTransact(IRecentsAnimationController.java:299)
	at android.os.Binder.execTransactInternal(Binder.java:1290)
	at android.os.Binder.execTransact(Binder.java:1249)
binder:3237_20 -> send IDLE_NOW_MSG

The activity animation of the previous exit page ends

RecentsAnimation.onAnimationFinished is triggered
because the window is visible, send PROCESS_STOPPING_AND_FINISHING_MSG message, and clear mClosingApps&mNextAppTransitionRequests

Breakpoint reached
	at com.android.server.wm.ActivityTaskSupervisor.scheduleProcessStoppingAndFinishingActivitiesIfNeeded(ActivityTaskSupervisor.java:2414)
	at com.android.server.wm.ActivityRecord.onAnimationFinished(ActivityRecord.java:8223)
	at com.android.server.wm.ActivityRecord.postApplyAnimation(ActivityRecord.java:5835)
	at com.android.server.wm.ActivityRecord.commitVisibility(ActivityRecord.java:5785)
	at com.android.server.wm.ActivityRecord.commitVisibility(ActivityRecord.java:5811)
	at com.android.server.wm.AppTransitionController.handleClosingApps(AppTransitionController.java:1194)
	at com.android.server.wm.AppTransitionController.handleAppTransitionReady(AppTransitionController.java:295)
	at com.android.server.wm.RootWindowContainer.checkAppTransitionReady(RootWindowContainer.java:998)
	at com.android.server.wm.RootWindowContainer.performSurfacePlacementNoTrace(RootWindowContainer.java:865)
	at com.android.server.wm.RootWindowContainer.performSurfacePlacement(RootWindowContainer.java:805)
	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacementLoop(WindowSurfacePlacer.java:199)
	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:148)
	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:137)
	at com.android.server.wm.WindowSurfacePlacer.continueLayout(WindowSurfacePlacer.java:119)
	at com.android.server.wm.ActivityTaskManagerService.continueWindowLayout(ActivityTaskManagerService.java:4695)
	at com.android.server.wm.RecentsAnimation.lambda$finishAnimation$0$com-android-server-wm-RecentsAnimation(RecentsAnimation.java:419)
	at com.android.server.wm.RecentsAnimation$$ExternalSyntheticLambda2.run(D8$$SyntheticClass:-1)
	at com.android.server.wm.WindowManagerService.inSurfaceTransaction(WindowManagerService.java:8865)
	at com.android.server.wm.RecentsAnimation.finishAnimation(RecentsAnimation.java:320)
	at com.android.server.wm.RecentsAnimation.onAnimationFinished(RecentsAnimation.java:438)
	at com.android.server.wm.RecentsAnimationController$3.finish(RecentsAnimationController.java:319)
	at android.view.IRecentsAnimationController$Stub.onTransact(IRecentsAnimationController.java:299)
	at android.os.Binder.execTransactInternal(Binder.java:1290)
	at android.os.Binder.execTransact(Binder.java:1249)
binder:3237_20 -> com.miui.gallery/.activity.HomePageActivity -> true
Thread[binder:3237_1A,5,main] -> Send PROCESS_STOPPING_AND_FINISHING_MSG
    
    Breakpoint reached
	at com.android.server.wm.AppTransition.goodToGo(AppTransition.java:391)
	at com.android.server.wm.AppTransitionController.handleAppTransitionReady(AppTransitionController.java:307)
	at com.android.server.wm.RootWindowContainer.checkAppTransitionReady(RootWindowContainer.java:998)
	at com.android.server.wm.RootWindowContainer.performSurfacePlacementNoTrace(RootWindowContainer.java:865)
	at com.android.server.wm.RootWindowContainer.performSurfacePlacement(RootWindowContainer.java:805)
	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacementLoop(WindowSurfacePlacer.java:199)
	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:148)
	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:137)
	at com.android.server.wm.WindowSurfacePlacer.continueLayout(WindowSurfacePlacer.java:119)
	at com.android.server.wm.ActivityTaskManagerService.continueWindowLayout(ActivityTaskManagerService.java:4695)
	at com.android.server.wm.RecentsAnimation.lambda$finishAnimation$0$com-android-server-wm-RecentsAnimation(RecentsAnimation.java:419)
	at com.android.server.wm.RecentsAnimation$$ExternalSyntheticLambda2.run(D8$$SyntheticClass:-1)
	at com.android.server.wm.WindowManagerService.inSurfaceTransaction(WindowManagerService.java:8865)
	at com.android.server.wm.RecentsAnimation.finishAnimation(RecentsAnimation.java:320)
	at com.android.server.wm.RecentsAnimation.onAnimationFinished(RecentsAnimation.java:438)
	at com.android.server.wm.RecentsAnimationController$3.finish(RecentsAnimationController.java:319)
	at android.view.IRecentsAnimationController$Stub.onTransact(IRecentsAnimationController.java:299)
	at android.os.Binder.execTransactInternal(Binder.java:1290)
	at android.os.Binder.execTransact(Binder.java:1249)
binder:3237_20 -> clear mNextAppTransitionRequests
    
Breakpoint reached
	at com.android.server.wm.AppTransitionController.handleAppTransitionReady(AppTransitionController.java:318)
	at com.android.server.wm.RootWindowContainer.checkAppTransitionReady(RootWindowContainer.java:998)
	at com.android.server.wm.RootWindowContainer.performSurfacePlacementNoTrace(RootWindowContainer.java:865)
	at com.android.server.wm.RootWindowContainer.performSurfacePlacement(RootWindowContainer.java:805)
	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacementLoop(WindowSurfacePlacer.java:199)
	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:148)
	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:137)
	at com.android.server.wm.WindowSurfacePlacer.continueLayout(WindowSurfacePlacer.java:119)
	at com.android.server.wm.ActivityTaskManagerService.continueWindowLayout(ActivityTaskManagerService.java:4695)
	at com.android.server.wm.RecentsAnimation.lambda$finishAnimation$0$com-android-server-wm-RecentsAnimation(RecentsAnimation.java:419)
	at com.android.server.wm.RecentsAnimation$$ExternalSyntheticLambda2.run(D8$$SyntheticClass:-1)
	at com.android.server.wm.WindowManagerService.inSurfaceTransaction(WindowManagerService.java:8865)
	at com.android.server.wm.RecentsAnimation.finishAnimation(RecentsAnimation.java:320)
	at com.android.server.wm.RecentsAnimation.onAnimationFinished(RecentsAnimation.java:438)
	at com.android.server.wm.RecentsAnimationController$3.finish(RecentsAnimationController.java:319)
	at android.view.IRecentsAnimationController$Stub.onTransact(IRecentsAnimationController.java:299)
	at android.os.Binder.execTransactInternal(Binder.java:1290)
	at android.os.Binder.execTransact(Binder.java:1249)
binder:3237_20 -> clear mClosingApps

Execute IDLE_NOW_MSG message

The animation ends and the execution is successful

Breakpoint reached
	at com.android.server.wm.ActivityTaskSupervisor.processStoppingAndFinishingActivities(ActivityTaskSupervisor.java:2164)
	at com.android.server.wm.ActivityTaskSupervisor.activityIdleInternal(ActivityTaskSupervisor.java:1519)
	at com.android.server.wm.ActivityTaskSupervisor$ActivityTaskSupervisorHandler.activityIdleFromMessage(ActivityTaskSupervisor.java:2672)
	at com.android.server.wm.ActivityTaskSupervisor$ActivityTaskSupervisorHandler.handleMessageInner(ActivityTaskSupervisor.java:2705)
	at com.android.server.wm.ActivityTaskSupervisor$ActivityTaskSupervisorHandler.handleMessage(ActivityTaskSupervisor.java:2647)
	at android.os.Handler.dispatchMessage(Handler.java:106)
	at android.os.Looper.loopOnce(Looper.java:210)
	at android.os.Looper.loop(Looper.java:299)
	at android.os.HandlerThread.run(HandlerThread.java:67)
	at com.android.server.ServiceThread.run(ServiceThread.java:46)
android.display ->com.miui.gallery/.activity.HomePageActivity  -> animating= false

Set the resume page to idle state

The app calls back activityIdle and sets the current resume page to idle state; because the stoppping list is already empty

Breakpoint reached
	at com.android.server.wm.ActivityTaskSupervisor.activityIdleInternal(ActivityTaskSupervisor.java:1519)
	at com.android.server.wm.ActivityClientController.activityIdle(ActivityClientController.java:150)
	at android.app.IActivityClientController$Stub.onTransact(IActivityClientController.java:558)
	at com.android.server.wm.ActivityClientController.onTransact(ActivityClientController.java:131)
	at android.os.Binder.execTransactInternal(Binder.java:1290)
	at android.os.Binder.execTransact(Binder.java:1249)
com.miui.gallery/.activity.HomePageActivity

how to analyze

direction

Switching to Stop in the same App is slow

  • The previous page must be completed in time onPause
  • The previous page has to finish the animation in time
  • The next page has to finish the animation in time and the window is visible or the main thread of the app is in the idle state in time

Desktop click icon desktop Stop slow

  • Desktop completes onPause in time
  • The desktop executes the Task animation in time
  • The next page has to finish the animation in time, the window is visible or the main thread of the desktop is in the idle state in time

Swipe up from the App to return to the home screen, Stop is slow

  • Execute RecentsAnimation in time

Log open & view

Execute the following command to enable the relevant debug switch:

adb shell am logging enable-text DEBUG_IDLE DEBUG_VISIBILITY
adb shell wm logging enable-text WM_DEBUG_ANIM WM_DEBUG_STATES

Check whether the switch is turned on smoothly:

adb shell dumpsys activity logging
adb shell dumpsys window logging

view log

adb logcat -b all -c
adb logcat -b all | egrep "activityIdleInternal|wm_add_to_stopping|Animation done in|Reporting visible in|wm_stop_activity|Ready to stop"

Switch pages in the same App

// 添加stoppping列表
09-23 15:58:35.754  6857 19863 I wm_add_to_stopping: [0,223949794,com.android.settings/.MainSettings,makeInvisible]
// 第一次执行idle消息
09-23 15:58:35.773  6857  6880 I ActivityTaskManager: activityIdleInternal(): r=null, mStartingUsers=[]
// app端回调activityIdle设置当前resume页面idle为true
09-23 15:58:35.896  6857 19863 D ActivityTaskManager: activityIdleInternal: Callers=com.android.server.wm.ActivityClientController.activityIdle:150 android.app.IActivityClientController$Stub.onTransact:558 com.android.server.wm.ActivityClientController.onTransact:131 android.os.Binder.execTransactInternal:1290 
09-23 15:58:35.897  6857 19863 I ActivityTaskManager: activityIdleInternal(): r=ActivityRecord{
    
    737204e u0 com.android.settings/.SubSettings} t190}, mStartingUsers=[]
// 上一个页面执行完动画
09-23 15:58:36.377  6857  6881 V WindowManager: Animation done in ActivityRecord{
    
    d5933e2 u0 com.android.settings/.MainSettings} t190}: reportedVisible=true okToDisplay=true okToAnimate=true startingDisplayed=false
// 下一个页面执行完动画
09-23 15:58:36.379  6857  6881 V WindowManager: Animation done in ActivityRecord{
    
    737204e u0 com.android.settings/.SubSettings} t190}: reportedVisible=false okToDisplay=true okToAnimate=true startingDisplayed=false
// 下一个页面可见并尝试发送idle消息
09-23 15:58:36.379  6857  6881 V WindowManager: Reporting visible in Token{
    
    2cd4705 ActivityRecord{
    
    737204e u0 com.android.settings/.SubSettings} t190}}
// 执行idle消息,处理stopping列表,开始stop
09-23 15:58:36.382  6857  6880 V WindowManager: Ready to stop: ActivityRecord{
    
    d5933e2 u0 com.android.settings/.MainSettings} t190}
09-23 15:58:36.383  6857  6880 I wm_stop_activity: [0,223949794,com.android.settings/.MainSettings]
// stop执行完
09-23 15:58:36.383  6857  6880 I ActivityTaskManager: activityIdleInternal(): r=null, mStartingUsers=[]
09-23 15:58:36.393  6857  6880 I ActivityTaskManager: activityIdleInternal(): r=null, mStartingUsers=[]

Click the App icon on the desktop

// 添加stoppping列表
09-23 16:11:45.009  5050  6955 I wm_add_to_stopping: [0,5778117,com.miui.home/.launcher.Launcher,makeInvisible]
09-23 16:11:45.044  5050  5074 I ActivityTaskManager: activityIdleInternal(): r=null, mStartingUsers=[]
// 上一个页面执行完动画,不满足all idle 且不满足 all resumed 无法发送消息
09-23 16:11:45.631  5050  5066 V WindowManager: Animation done in ActivityRecord{
    
    582ac5 u0 com.miui.home/.launcher.Launcher} t2}: reportedVisible=true okToDisplay=true okToAnimate=true startingDisplayed=false
// 下一个页面执行完动画
09-23 16:11:45.632  5050  5066 V WindowManager: Animation done in ActivityRecord{
    
    ffd4f24 u0 com.android.settings/.MainSettings} t8}: reportedVisible=false okToDisplay=true okToAnimate=true startingDisplayed=true
// 下一个页面可见,满足all resumed 发送 PROCESS_STOPPING_AND_FINISHING_MSG消息
09-23 16:11:45.840  5050  5075 V WindowManager: Reporting visible in Token{
    
    cec9289 ActivityRecord{
    
    ffd4f24 u0 com.android.settings/.MainSettings} t8}}
// app端回调activityIdle设置当前resume页面idle为true
09-23 16:11:45.862  5050  9625 D ActivityTaskManager: activityIdleInternal: Callers=com.android.server.wm.ActivityClientController.activityIdle:150 android.app.IActivityClientController$Stub.onTransact:558 com.android.server.wm.ActivityClientController.onTransact:131 android.os.Binder.execTransactInternal:1290
// 同个binder线程开始执行stop
09-23 16:11:45.864  5050  9625 V WindowManager: Ready to stop: ActivityRecord{
    
    582ac5 u0 com.miui.home/.launcher.Launcher} t2}
09-23 16:11:45.865  5050  9625 I wm_stop_activity: [0,5778117,com.miui.home/.launcher.Launcher]
// stop执行完
09-23 16:11:45.865  5050  9625 I ActivityTaskManager: activityIdleInternal(): r=ActivityRecord{
    
    ffd4f24 u0 com.android.settings/.MainSettings} t8}, mStartingUsers=[]
09-23 16:11:45.934  5050  6955 V WindowManager: Animation done in WindowStateAnimator{
    
    3b00274 com.android.settings/com.android.settings.MainSettings}: exiting=false, reportedVisible=true
09-23 16:11:46.094  5050  5075 V WindowManager: Animation done in WindowStateAnimator{
    
    73f30a7 Splash Screen com.android.settings}: exiting=true, reportedVisible=true

Return to desktop from App

09-23 16:18:38.604  5050  6692 V WindowManager: Animation done in WindowStateAnimator{
    
    3b00274 com.android.settings/com.android.settings.MainSettings}: exiting=false, reportedVisible=true
09-23 16:18:38.605  5050  6692 V WindowManager: Animation done in WindowStateAnimator{
    
    2a9644e com.miui.home/com.miui.home.launcher.Launcher}: exiting=false, reportedVisible=false
// 下一个页面可见,满足all resumed 发送 PROCESS_STOPPING_AND_FINISHING_MSG消息
09-23 16:18:38.605  5050  6692 V WindowManager: Reporting visible in Token{
    
    15ae41 ActivityRecord{
    
    582ac5 u0 com.miui.home/.launcher.Launcher} t2}}
// 同个binder线程添加stoppping列表,发送idle消息
09-23 16:18:38.624  5050  6692 I wm_add_to_stopping: [0,268259108,com.android.settings/.MainSettings,makeInvisible]
// 同个binder线程上一个页面执行完动画
09-23 16:18:38.640  5050  6692 V WindowManager: Animation done in ActivityRecord{
    
    ffd4f24 u0 com.android.settings/.MainSettings} t8}: reportedVisible=true okToDisplay=true okToAnimate=true startingDisplayed=false
// 执行idle消息,开始stop
09-23 16:18:38.673  5050  5074 V WindowManager: Ready to stop: ActivityRecord{
    
    ffd4f24 u0 com.android.settings/.MainSettings} t8}
09-23 16:18:38.675  5050  5074 I wm_stop_activity: [0,268259108,com.android.settings/.MainSettings]
//当前idle消息执行完
09-23 16:18:38.675  5050  5074 I ActivityTaskManager: activityIdleInternal(): r=null, mStartingUsers=[]
// app端回调activityIdle设置当前resume页面idle为true
09-23 16:18:38.779  5050  6692 D ActivityTaskManager: activityIdleInternal: Callers=com.android.server.wm.ActivityClientController.activityIdle:150 android.app.IActivityClientController$Stub.onTransact:558 com.android.server.wm.ActivityClientController.onTransact:131 android.os.Binder.execTransactInternal:1290 
09-23 16:18:38.782  5050  6692 I ActivityTaskManager: activityIdleInternal(): r=ActivityRecord{
    
    582ac5 u0 com.miui.home/.launcher.Launcher} t2}, mStartingUsers=[]

Guess you like

Origin blog.csdn.net/xiaoyantan/article/details/126986441