diff --git a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java index cc130c4076909..f9dac3ad930dd 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java +++ b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java @@ -621,6 +621,13 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { mFinishingActivities.remove(r); stopWaitingForActivityVisible(r); + + final Task task = r.getTask(); + if (task != null && task.mKillProcessesOnDestroyed && task.getTopMostActivity() == r) { + // The activity is destroyed or its process is died, so cancel the pending kill. + task.mKillProcessesOnDestroyed = false; + removeTimeoutOfKillProcessesOnDestroyed(task); + } } /** There is no valid launch time, just stop waiting. */ @@ -1903,9 +1910,13 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { killTaskProcessesIfPossible(task); } + private void removeTimeoutOfKillProcessesOnDestroyed(Task task) { + mHandler.removeMessages(KILL_TASK_PROCESSES_TIMEOUT_MSG, task); + } + void killTaskProcessesOnDestroyedIfNeeded(Task task) { if (task == null || !task.mKillProcessesOnDestroyed) return; - mHandler.removeMessages(KILL_TASK_PROCESSES_TIMEOUT_MSG, task); + removeTimeoutOfKillProcessesOnDestroyed(task); killTaskProcessesIfPossible(task); } @@ -2778,7 +2789,7 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { } break; case KILL_TASK_PROCESSES_TIMEOUT_MSG: { final Task task = (Task) msg.obj; - if (task.mKillProcessesOnDestroyed) { + if (task.mKillProcessesOnDestroyed && task.hasActivity()) { Slog.i(TAG, "Destroy timeout of remove-task, attempt to kill " + task); killTaskProcessesIfPossible(task); } diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java index 7cb58022c0e79..77d5908c63a54 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java @@ -1038,6 +1038,13 @@ public class RecentTasksTest extends WindowTestsBase { top.setState(ActivityRecord.State.DESTROYING, "test"); top.destroyed("test"); assertFalse(task.mKillProcessesOnDestroyed); + + // If the process is died, the state should be cleared. + final Task lastTask = tasks.get(0); + lastTask.addChild(top); + lastTask.mKillProcessesOnDestroyed = true; + top.handleAppDied(); + assertFalse(lastTask.mKillProcessesOnDestroyed); } @Test