diff options
-rw-r--r-- | services/java/com/android/server/am/ActivityManagerService.java | 7 | ||||
-rw-r--r-- | services/java/com/android/server/am/ActivityStack.java | 54 |
2 files changed, 45 insertions, 16 deletions
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java index 4678b85..1813593 100644 --- a/services/java/com/android/server/am/ActivityManagerService.java +++ b/services/java/com/android/server/am/ActivityManagerService.java @@ -6517,8 +6517,11 @@ public final class ActivityManagerService extends ActivityManagerNative } } final long origId = Binder.clearCallingIdentity(); - stack.moveTaskToBackLocked(taskId, null); - Binder.restoreCallingIdentity(origId); + try { + stack.moveTaskToBackLocked(taskId, null); + } finally { + Binder.restoreCallingIdentity(origId); + } } } } diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java index 2fefadf..8d27c5c 100644 --- a/services/java/com/android/server/am/ActivityStack.java +++ b/services/java/com/android/server/am/ActivityStack.java @@ -255,7 +255,7 @@ final class ActivityStack { //public Handler() { // if (localLOGV) Slog.v(TAG, "Handler started!"); //} - public ActivityStackHandler(Looper looper) { + ActivityStackHandler(Looper looper) { super(looper); } @@ -331,7 +331,6 @@ final class ActivityStack { mWindowManager = service.mWindowManager; mStackSupervisor = service.mStackSupervisor; mContext = context; - PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE); mStackId = stackId; mCurrentUser = service.mCurrentUserId; } @@ -837,7 +836,7 @@ final class ActivityStack { } } - private final void completePauseLocked() { + private void completePauseLocked() { ActivityRecord prev = mPausingActivity; if (DEBUG_PAUSE) Slog.v(TAG, "Complete pause: " + prev); @@ -1765,7 +1764,7 @@ final class ActivityStack { for (int taskNdx = 0; taskNdx < numTasks; ++taskNdx) { TaskRecord task = mTaskHistory.get(taskNdx); final ArrayList<ActivityRecord> activities = task.mActivities; - if (activities.size() == 0) { + if (activities.isEmpty()) { continue; } TaskGroup group = new TaskGroup(); @@ -2335,7 +2334,7 @@ final class ActivityStack { finishActivityResultsLocked(r, resultCode, resultData); - if (mService.mPendingThumbnails.size() > 0) { + if (!mService.mPendingThumbnails.isEmpty()) { // There are clients waiting to receive thumbnails so, in case // this is an activity that someone is waiting for, add it // to the pending list so we can correctly update the clients. @@ -2561,7 +2560,7 @@ final class ActivityStack { cleanUpActivityServicesLocked(r); } - if (mService.mPendingThumbnails.size() > 0) { + if (!mService.mPendingThumbnails.isEmpty()) { // There are clients waiting to receive thumbnails so, in case // this is an activity that someone is waiting for, add it // to the pending list so we can correctly update the clients. @@ -2698,7 +2697,7 @@ final class ActivityStack { mService.mHandler.sendEmptyMessage( ActivityManagerService.CANCEL_HEAVY_NOTIFICATION_MSG); } - if (r.app.activities.size() == 0) { + if (r.app.activities.isEmpty()) { // No longer have activities, so update oom adj. mService.updateOomAdjLocked(); } @@ -3009,9 +3008,38 @@ final class ActivityStack { if (tr == null) { return false; } + mTaskHistory.remove(tr); mTaskHistory.add(0, tr); + // There is an assumption that moving a task to the back moves it behind the home activity. + // We make sure here that some activity in the stack will launch home. + ActivityRecord lastActivity = null; + int numTasks = mTaskHistory.size(); + int taskNdx; + for (taskNdx = numTasks - 1; taskNdx >= 1; --taskNdx) { + final ArrayList<ActivityRecord> activities = mTaskHistory.get(taskNdx).mActivities; + int activityNdx; + for (activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) { + final ActivityRecord r = activities.get(activityNdx); + if (r.mLaunchHomeTaskNext) { + break; + } + if (taskNdx == 1 && activityNdx == 0) { + // Final activity before tr task. + lastActivity = r; + } + } + if (activityNdx >= 0) { + // Early exit, we found an activity that will launchHomeTaskNext. + break; + } + } + if (lastActivity != null) { + // No early exit, we did not find an activity that will launchHomeTaskNext, set one. + lastActivity.mLaunchHomeTaskNext = true; + } + if (reason != null && (reason.intent.getFlags() & Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) { mWindowManager.prepareAppTransition(AppTransition.TRANSIT_NONE, false); @@ -3020,8 +3048,7 @@ final class ActivityStack { mNoAnimActivities.add(r); } } else { - mWindowManager.prepareAppTransition( - AppTransition.TRANSIT_TASK_TO_BACK, false); + mWindowManager.prepareAppTransition(AppTransition.TRANSIT_TASK_TO_BACK, false); } mWindowManager.moveTaskToBottom(task); @@ -3029,9 +3056,8 @@ final class ActivityStack { validateAppTokensLocked(); } - if (mResumedActivity != null && mResumedActivity.task == tr && - mResumedActivity.mLaunchHomeTaskNext) { - // TODO: Can we skip the next line and just pass mResumedAct. to resumeHomeAct.()? + if (numTasks <= 1 || (mResumedActivity != null && mResumedActivity.task == tr && + mResumedActivity.mLaunchHomeTaskNext)) { mResumedActivity.mLaunchHomeTaskNext = false; return mStackSupervisor.resumeHomeActivity(null); } @@ -3175,7 +3201,7 @@ final class ActivityStack { return true; } - private final boolean relaunchActivityLocked(ActivityRecord r, + private boolean relaunchActivityLocked(ActivityRecord r, int changes, boolean andResume) { List<ResultInfo> results = null; List<Intent> newIntents = null; @@ -3487,7 +3513,7 @@ final class ActivityStack { boolean removeTask(TaskRecord task) { mTaskHistory.remove(task); - return mTaskHistory.size() == 0; + return mTaskHistory.isEmpty(); } TaskRecord createTaskRecord(int taskId, ActivityInfo info, Intent intent, boolean toTop) { |