diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index e6e18fd880cf2..37003adba59e4 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -3687,7 +3687,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A @Override void removeImmediately() { - if (!finishing) { + if (!isState(DESTROYING, DESTROYED)) { // If Task#removeImmediately is called directly with alive activities, ensure that the // activities are destroyed and detached from process. destroyImmediately("removeImmediately"); 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 41f2246858b44..54406c2b21aad 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -1615,6 +1615,21 @@ public class ActivityRecordTests extends WindowTestsBase { assertFalse(wpc.hasActivities()); } + @Test + public void testRemoveImmediatelyWithFinishingActivity() throws RemoteException { + final ActivityRecord activity = createActivityWithTask(); + final WindowProcessController wpc = activity.app; + activity.makeFinishingLocked(); + assertTrue(activity.finishing); + + activity.getTask().removeImmediately("test"); + + verify(mAtm.getLifecycleManager()).scheduleTransaction(any(), eq(activity.appToken), + isA(DestroyActivityItem.class)); + assertFalse(wpc.hasActivities()); + assertEquals(DESTROYING, activity.getState()); + } + @Test public void testRemoveFromHistory() { final ActivityRecord activity = createActivityWithTask();