summaryrefslogtreecommitdiffstats
path: root/services/java/com
diff options
context:
space:
mode:
Diffstat (limited to 'services/java/com')
-rw-r--r--services/java/com/android/server/am/ActivityStack.java65
-rw-r--r--services/java/com/android/server/am/ActivityStackSupervisor.java22
-rw-r--r--services/java/com/android/server/am/TaskRecord.java10
3 files changed, 65 insertions, 32 deletions
diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java
index a88c3cc..d5059b6 100644
--- a/services/java/com/android/server/am/ActivityStack.java
+++ b/services/java/com/android/server/am/ActivityStack.java
@@ -334,20 +334,16 @@ final class ActivityStack {
mCurrentUser = service.mCurrentUserId;
}
- private boolean okToShow(ActivityRecord r) {
+ boolean okToShow(ActivityRecord r) {
return r.userId == mCurrentUser
|| (r.info.flags & ActivityInfo.FLAG_SHOW_ON_LOCK_SCREEN) != 0;
}
final ActivityRecord topRunningActivityLocked(ActivityRecord notTop) {
for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
- final TaskRecord task = mTaskHistory.get(taskNdx);
- final ArrayList<ActivityRecord> activities = task.mActivities;
- for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
- ActivityRecord r = activities.get(activityNdx);
- if (!r.finishing && r != notTop && okToShow(r)) {
- return r;
- }
+ ActivityRecord r = mTaskHistory.get(taskNdx).topRunningActivityLocked(notTop);
+ if (r != null) {
+ return r;
}
}
return null;
@@ -3401,11 +3397,16 @@ final class ActivityStack {
}
}
- void handleAppDiedLocked(ProcessRecord app, boolean restarting) {
+ /**
+ * Reset local parameters because an app's activity died.
+ * @param app The app of the activity that died.
+ * @return true if home should be launched next.
+ */
+ boolean handleAppDiedLocked(ProcessRecord app) {
if (!containsApp(app)) {
- return;
+ return false;
}
- // TODO: handle the case where an app spans multiple stacks.
+
if (mPausingActivity != null && mPausingActivity.app == app) {
if (DEBUG_PAUSE || DEBUG_CLEANUP) Slog.v(TAG,
"App died while pausing: " + mPausingActivity);
@@ -3415,28 +3416,32 @@ final class ActivityStack {
mLastPausedActivity = null;
mLastNoHistoryActivity = null;
}
- final ActivityRecord top = topRunningActivityLocked(null);
- final boolean launchHomeTaskNext =
- top != null && top.app == app && top.task.mOnTopOfHome;
-
- // Remove this application's activities from active lists.
- boolean hasVisibleActivities = removeHistoryRecordsForAppLocked(app);
- if (!restarting) {
- ActivityStack stack = mStackSupervisor.getFocusedStack();
- if (stack == null || launchHomeTaskNext) {
- mStackSupervisor.resumeHomeActivity(null);
- } else if (!mStackSupervisor.resumeTopActivitiesLocked(stack, null, null)) {
- // If there was nothing to resume, and we are not already
- // restarting this process, but there is a visible activity that
- // is hosted by the process... then make sure all visible
- // activities are running, taking care of restarting this
- // process.
- if (hasVisibleActivities) {
- mStackSupervisor.ensureActivitiesVisibleLocked(null, 0);
- }
+ // Determine if the top task is exiting and should return to home. Do this before it gets
+ // removed in removeHistoryRecordsForAppsLocked.
+ boolean launchHomeNext = false;
+ int top = mTaskHistory.size() - 1;
+ while (top >= 0) {
+ final TaskRecord topTask = mTaskHistory.get(top);
+ if (topTask.mActivities.isEmpty()) {
+ // Not possible, but just in case.
+ --top;
+ continue;
}
+ ActivityRecord r = topTask.topRunningActivityLocked(null);
+ if (r != null) {
+ // r will be launched next.
+ break;
+ }
+ // There is an activity in topTask that is finishing. If topTask belongs to the app
+ // return to home depending on the task flag.
+ launchHomeNext = topTask.mOnTopOfHome;
+ break;
}
+
+ removeHistoryRecordsForAppLocked(app);
+
+ return launchHomeNext;
}
void handleAppCrashLocked(ProcessRecord app) {
diff --git a/services/java/com/android/server/am/ActivityStackSupervisor.java b/services/java/com/android/server/am/ActivityStackSupervisor.java
index 1ee13ec..bf91904 100644
--- a/services/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/java/com/android/server/am/ActivityStackSupervisor.java
@@ -1932,10 +1932,28 @@ public final class ActivityStackSupervisor {
}
void handleAppDiedLocked(ProcessRecord app, boolean restarting) {
- // Just in case.
+ boolean launchHomeTaskNext = false;
+ final ActivityStack focusedStack = getFocusedStack();
final int numStacks = mStacks.size();
for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
- mStacks.get(stackNdx).handleAppDiedLocked(app, restarting);
+ final ActivityStack stack = mStacks.get(stackNdx);
+ // Only update launchHomeTaskNext for the focused stack.
+ launchHomeTaskNext |= (stack == focusedStack && stack.handleAppDiedLocked(app));
+ }
+
+ if (!restarting) {
+ if (launchHomeTaskNext) {
+ resumeHomeActivity(null);
+ } else {
+ if (!resumeTopActivitiesLocked(focusedStack, null, null)) {
+ // If there was nothing to resume, and we are not already
+ // restarting this process, but there is a visible activity that
+ // is hosted by the process... then make sure all visible
+ // activities are running, taking care of restarting this
+ // process.
+ ensureActivitiesVisibleLocked(null, 0);
+ }
+ }
}
}
diff --git a/services/java/com/android/server/am/TaskRecord.java b/services/java/com/android/server/am/TaskRecord.java
index f0bba4f..8a9324c 100644
--- a/services/java/com/android/server/am/TaskRecord.java
+++ b/services/java/com/android/server/am/TaskRecord.java
@@ -139,6 +139,16 @@ final class TaskRecord extends ThumbnailHolder {
return null;
}
+ ActivityRecord topRunningActivityLocked(ActivityRecord notTop) {
+ for (int activityNdx = mActivities.size() - 1; activityNdx >= 0; --activityNdx) {
+ ActivityRecord r = mActivities.get(activityNdx);
+ if (!r.finishing && r != notTop && stack.okToShow(r)) {
+ return r;
+ }
+ }
+ return null;
+ }
+
/**
* Reorder the history stack so that the activity at the given index is
* brought to the front.