summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/app/ActivityManager.java8
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java2
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java21
3 files changed, 30 insertions, 1 deletions
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index 6307477aa766..420bf31a189d 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -608,6 +608,14 @@ public class ActivityManager {
public static boolean resizeStackWithLaunchBounds(int stackId) {
return stackId == PINNED_STACK_ID;
}
+
+ /**
+ * Returns true if any visible windows belonging to apps in this stack should be kept on
+ * screen when the app is killed due to something like the low memory killer.
+ */
+ public static boolean keepVisibleDeadAppWindowOnScreen(int stackId) {
+ return stackId != PINNED_STACK_ID;
+ }
}
/**
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 1021411084c3..5adf6278dd9d 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -2193,7 +2193,7 @@ public class WindowManagerService extends IWindowManager.Stub
// need to see about starting one.
wasVisible = win.isWinVisibleLw();
- if (wasVisible && appToken != null && appToken.appDied) {
+ if (win.shouldKeepVisibleDeadAppWindow()) {
if (DEBUG_ADD_REMOVE) Slog.v(TAG_WM,
"Not removing " + win + " because app died while it's visible");
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index dca7735f02fc..e8de90c93f0a 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -1615,6 +1615,27 @@ final class WindowState implements WindowManagerPolicy.WindowState {
}
}
+ /**
+ * Returns true if this window is visible and belongs to a dead app and shouldn't be removed,
+ * because we want to preserve its location on screen to be re-activated later when the user
+ * interacts with it.
+ */
+ boolean shouldKeepVisibleDeadAppWindow() {
+ if (!isWinVisibleLw() || mAppToken == null || !mAppToken.appDied) {
+ // Not a visible app window or the app isn't dead.
+ return false;
+ }
+
+ if (mAttrs.type == TYPE_APPLICATION_STARTING) {
+ // We don't keep starting windows since they were added by the window manager before
+ // the app even launched.
+ return false;
+ }
+
+ final TaskStack stack = getStack();
+ return stack != null && StackId.keepVisibleDeadAppWindowOnScreen(stack.mStackId);
+ }
+
/** @return true if this window desires key events. */
boolean canReceiveKeys() {
return isVisibleOrAdding()