diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 4439a24a4b077..d83a750ccbb36 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -3764,7 +3764,8 @@ final class ActivityStack { r.finishLaunchTickingLocked(); } - private void removeActivityFromHistoryLocked(ActivityRecord r, String reason) { + private void removeActivityFromHistoryLocked( + ActivityRecord r, TaskRecord oldTop, String reason) { mStackSupervisor.removeChildActivityContainers(r); finishActivityResultsLocked(r, Activity.RESULT_CANCELED, null); r.makeFinishingLocked(); @@ -3783,10 +3784,11 @@ final class ActivityStack { validateAppTokensLocked(); } final TaskRecord task = r.task; + final TaskRecord topTask = oldTop != null ? oldTop : topTask(); if (task != null && task.removeActivity(r)) { if (DEBUG_STACK) Slog.i(TAG_STACK, "removeActivityFromHistoryLocked: last activity removed from " + this); - if (mStackSupervisor.isFocusedStack(this) && task == topTask() && + if (mStackSupervisor.isFocusedStack(this) && task == topTask && task.isOverHomeStack()) { mStackSupervisor.moveHomeStackTaskToTop(task.getTaskToReturnTo(), reason); } @@ -3922,6 +3924,12 @@ final class ActivityStack { boolean removedFromHistory = false; + // If the activity is finishing, it's no longer considered in topRunningActivityLocked, + // and cleanUpActivityLocked() may change focus to another activity (or task). + // Get the current top task now, as removeActivityFromHistoryLocked() below need this + // to decide whether to return to home stack after removal. + final TaskRecord topTask = topTask(); + cleanUpActivityLocked(r, false, false); final boolean hadApp = r.app != null; @@ -3956,7 +3964,8 @@ final class ActivityStack { // up. //Slog.w(TAG, "Exception thrown during finish", e); if (r.finishing) { - removeActivityFromHistoryLocked(r, reason + " exceptionInScheduleDestroy"); + removeActivityFromHistoryLocked( + r, topTask, reason + " exceptionInScheduleDestroy"); removedFromHistory = true; skipDestroy = true; } @@ -3987,7 +3996,7 @@ final class ActivityStack { } else { // remove this record from the history. if (r.finishing) { - removeActivityFromHistoryLocked(r, reason + " hadNoApp"); + removeActivityFromHistoryLocked(r, topTask, reason + " hadNoApp"); removedFromHistory = true; } else { if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to DESTROYED: " + r + " (no app)"); @@ -4018,7 +4027,7 @@ final class ActivityStack { if (isInStackLocked(r) != null) { if (r.state == ActivityState.DESTROYING) { cleanUpActivityLocked(r, true, false); - removeActivityFromHistoryLocked(r, reason); + removeActivityFromHistoryLocked(r, null, reason); } } mStackSupervisor.resumeFocusedStackTopActivityLocked(); @@ -4176,7 +4185,7 @@ final class ActivityStack { } cleanUpActivityLocked(r, true, true); if (remove) { - removeActivityFromHistoryLocked(r, "appDied"); + removeActivityFromHistoryLocked(r, null, "appDied"); } } }