diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index aa0c62c659733..38e8785b0692d 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -2065,7 +2065,8 @@ final class ActivityRecord extends ConfigurationContainer { * - should be either the topmost in task, or right below the top activity that is finishing * If all of these conditions are not met at the same time, the activity cannot be made active. */ - private boolean shouldMakeActive(ActivityRecord activeActivity) { + @VisibleForTesting + boolean shouldMakeActive(ActivityRecord activeActivity) { // If the activity is stopped, stopping, cycle to an active state. We avoid doing // this when there is an activity waiting to become translucent as the extra binder // calls will lead to noticeable jank. A later call to @@ -2080,6 +2081,11 @@ final class ActivityRecord extends ConfigurationContainer { return false; } + if (!mStackSupervisor.readyToResume()) { + // Making active is currently deferred (e.g. because an activity launch is in progress). + return false; + } + if (this.mLaunchTaskBehind) { // This activity is being launched from behind, which means that it's not intended to be // presented to user right now, even if it's set to be visible. diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java index 319ffed3778c9..f1506a0ebc224 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -368,4 +368,15 @@ public class ActivityRecordTests extends ActivityTestsBase { verify(mService.getLifecycleManager()).scheduleTransaction(eq(mActivity.app.getThread()), eq(mActivity.appToken), eq(expected)); } + + @Test + public void testShouldMakeActive_deferredResume() { + mActivity.setState(ActivityStack.ActivityState.STOPPED, "Testing"); + + mSupervisor.beginDeferResume(); + assertEquals(false, mActivity.shouldMakeActive(null /* activeActivity */)); + + mSupervisor.endDeferResume(); + assertEquals(true, mActivity.shouldMakeActive(null /* activeActivity */)); + } }