Android Activity切换onstop的调用流程是怎样的?
主要有一下两种情况,会调用触发Activity调用onStop:
1.activityIdle 触发
12-31 16:35:20.977 912 1895 D ActivityTaskManager: Stopping: ActivityRecord{8467d38 u0 com.android.launcher3/.Launcher t37}, callstack =
12-31 16:35:20.977 912 1895 D ActivityTaskManager: java.lang.Throwable
12-31 16:35:20.977 912 1895 D ActivityTaskManager: at com.android.server.wm.ActivityRecord.stopIfPossible(ActivityRecord.java:5036)
12-31 16:35:20.977 912 1895 D ActivityTaskManager: at com.android.server.wm.ActivityStackSupervisor.processStoppingAndFinishingActivities(ActivityStackSupervisor.java:1863)
12-31 16:35:20.977 912 1895 D ActivityTaskManager: at com.android.server.wm.ActivityStackSupervisor.activityIdleInternal(ActivityStackSupervisor.java:1326)
12-31 16:35:20.977 912 1895 D ActivityTaskManager: at com.android.server.wm.ActivityTaskManagerService.activityIdle(ActivityTaskManagerService.java:1838)
12-31 16:35:20.977 912 1895 D ActivityTaskManager: at android.app.IActivityTaskManager$Stub.onTransact(IActivityTaskManager.java:1920)
12-31 16:35:20.977 912 1895 D ActivityTaskManager: at android.os.Binder.execTransactInternal(Binder.java:1159)
12-31 16:35:20.977 912 1895 D ActivityTaskManager: at android.os.Binder.execTransact(Binder.java:1123)
- onAnimationFinished触发
12-31 16:35:23.208 912 1047 D ActivityTaskManager: Stopping: ActivityRecord{8467d38 u0 com.android.launcher3/.Launcher t37}, callstack =
12-31 16:35:23.208 912 1047 D ActivityTaskManager: java.lang.Throwable
12-31 16:35:23.208 912 1047 D ActivityTaskManager: at com.android.server.wm.ActivityRecord.stopIfPossible(ActivityRecord.java:5036)
12-31 16:35:23.208 912 1047 D ActivityTaskManager: at com.android.server.wm.ActivityStackSupervisor.processStoppingAndFinishingActivities(ActivityStackSupervisor.java:1863)
12-31 16:35:23.208 912 1047 D ActivityTaskManager: at com.android.server.wm.ActivityStackSupervisor.access$300(ActivityStackSupervisor.java:158)
12-31 16:35:23.208 912 1047 D ActivityTaskManager: at com.android.server.wm.ActivityStackSupervisor$ActivityStackSupervisorHandler.handleMessageInner(ActivityStackSupervisor.java:2432)
12-31 16:35:23.208 912 1047 D ActivityTaskManager: at com.android.server.wm.ActivityStackSupervisor$ActivityStackSupervisorHandler.handleMessage(ActivityStackSupervisor.java:2351)
12-31 16:35:23.208 912 1047 D ActivityTaskManager: at android.os.Handler.dispatchMessage(Handler.java:106)
12-31 16:35:23.208 912 1047 D ActivityTaskManager: at android.os.Looper.loop(Looper.java:223)
12-31 16:35:23.208 912 1047 D ActivityTaskManager: at android.os.HandlerThread.run(HandlerThread.java:67)
12-31 16:35:23.208 912 1047 D ActivityTaskManager: at com.android.server.ServiceThread.run(ServiceThread.java:44)
@Override
protected void onAnimationFinished(@AnimationType int type, AnimationAdapter anim) {
super.onAnimationFinished(type, anim);
Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "AR#onAnimationFinished");
mTransit = TRANSIT_UNSET;
mTransitFlags = 0;
mNeedsAnimationBoundsLayer = false;
setAppLayoutChanges(FINISH_LAYOUT_REDO_ANIM | FINISH_LAYOUT_REDO_WALLPAPER,
"ActivityRecord");
clearThumbnail();
setClientVisible(isVisible() || mVisibleRequested);
getDisplayContent().computeImeTargetIfNeeded(this);
if (DEBUG_ANIM) Slog.v(TAG, "Animation done in " + this
+ ": reportedVisible=" + reportedVisible
+ " okToDisplay=" + okToDisplay()
+ " okToAnimate=" + okToAnimate()
+ " startingDisplayed=" + startingDisplayed);
// clean up thumbnail window
if (mThumbnail != null) {
mThumbnail.destroy();
mThumbnail = null;
}
// WindowState.onExitAnimationDone might modify the children list, so make a copy and then
// traverse the copy.
final ArrayList<WindowState> children = new ArrayList<>(mChildren);
children.forEach(WindowState::onExitAnimationDone);
getDisplayContent().mAppTransition.notifyAppTransitionFinishedLocked(token);
scheduleAnimation();
if (!mStackSupervisor.mStoppingActivities.isEmpty()
|| !mStackSupervisor.mFinishingActivities.isEmpty()) {
if (mRootWindowContainer.allResumedActivitiesIdle()) {
// If all activities are already idle then we now need to make sure we perform
// the full stop of this activity. This is because we won't do that while they
// are still waiting for the animation to finish.
mStackSupervisor.scheduleIdle();
} else if (mRootWindowContainer.allResumedActivitiesVisible()) {
// If all resumed activities are already visible (and should be drawn, see
// updateReportedVisibility ~ nowVisible) but not idle, we still schedule to
// process the stopping and finishing activities because the transition is done.
// This also avoids if the next activity never reports idle (e.g. animating view),
// the previous will need to wait until idle timeout to be stopped or destroyed.
mStackSupervisor.scheduleProcessStoppingAndFinishingActivities();
}
}
Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
}