From e8902452eaf2035ff2f61379ac64f2c729e115d1 Mon Sep 17 00:00:00 2001 From: Louis Chang Date: Mon, 10 Jun 2019 10:49:28 +0800 Subject: [PATCH] Fix empty stacks leaked after blocking background activity launches. Background activity starts were blocked while stacks were created and leaked. Remove the stack if the activity failed to launch and no activities left in the stack. Also avoid creating new stack for the blocked background activity which is unnecessary. Bug: 134016361 Test: atest BackgroundActivityLaunchTest Change-Id: Ifa04a9062cb771929a9614cc164fd64b3f60edf1 --- .../android/server/wm/ActivityStarter.java | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index 5c55c2e63da1b..0a88eef86ea89 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -1419,6 +1419,13 @@ class ActivityStarter { stack.finishActivityLocked(mStartActivity, RESULT_CANCELED, null /* intentResultData */, "startActivity", true /* oomAdj */); } + + // Stack should also be detached from display and be removed if it's empty. + if (startedActivityStack != null && startedActivityStack.isAttached() + && startedActivityStack.numActivities() == 0 + && !startedActivityStack.isActivityTypeHome()) { + startedActivityStack.remove(); + } } mService.mWindowManager.continueSurfaceLayout(); } @@ -2289,15 +2296,17 @@ class ActivityStarter { } private int setTaskFromReuseOrCreateNewTask(TaskRecord taskToAffiliate) { + if (mRestrictedBgActivity && (mReuseTask == null || !mReuseTask.containsAppUid(mCallingUid)) + && handleBackgroundActivityAbort(mStartActivity)) { + return START_ABORTED; + } + mTargetStack = computeStackFocus(mStartActivity, true, mLaunchFlags, mOptions); // Do no move the target stack to front yet, as we might bail if // isLockTaskModeViolation fails below. if (mReuseTask == null) { - if (mRestrictedBgActivity && handleBackgroundActivityAbort(mStartActivity)) { - return START_ABORTED; - } final TaskRecord task = mTargetStack.createTaskRecord( mSupervisor.getNextTaskIdForUserLocked(mStartActivity.mUserId), mNewTaskInfo != null ? mNewTaskInfo : mStartActivity.info, @@ -2310,11 +2319,6 @@ class ActivityStarter { if (DEBUG_TASKS) Slog.v(TAG_TASKS, "Starting new activity " + mStartActivity + " in new task " + mStartActivity.getTaskRecord()); } else { - if (mRestrictedBgActivity && !mReuseTask.containsAppUid(mCallingUid)) { - if (handleBackgroundActivityAbort(mStartActivity)) { - return START_ABORTED; - } - } addOrReparentStartingActivity(mReuseTask, "setTaskFromReuseOrCreateNewTask"); }