OSDN Git Service

Return tasks in correct order.
authorCraig Mautner <cmautner@google.com>
Thu, 19 Sep 2013 18:20:17 +0000 (11:20 -0700)
committerCraig Mautner <cmautner@google.com>
Thu, 19 Sep 2013 18:20:17 +0000 (11:20 -0700)
Fixed ActivityManager.getRunningTasks().

Fixes bug 10705790.

Change-Id: Ia3f66e592e08a87896a1ab59f980618ec5310dfe

core/java/android/app/ActivityManager.java
services/java/com/android/server/am/ActivityStack.java
services/java/com/android/server/am/ActivityStackSupervisor.java

index 2d28280..476274e 100644 (file)
@@ -672,6 +672,12 @@ public class ActivityManager {
          */
         public int numRunning;
 
+        /**
+         * Last time task was run. For sorting.
+         * @hide
+         */
+        public long lastActiveTime;
+
         public RunningTaskInfo() {
         }
 
index c31c213..dc86f05 100644 (file)
@@ -3323,11 +3323,10 @@ final class ActivityStack {
         return didSomething;
     }
 
-    ActivityRecord getTasksLocked(int maxNum, IThumbnailReceiver receiver,
+    ActivityRecord getTasksLocked(IThumbnailReceiver receiver,
             PendingThumbnailsRecord pending, List<RunningTaskInfo> list) {
         ActivityRecord topRecord = null;
-        for (int taskNdx = mTaskHistory.size() - 1; maxNum > 0 && taskNdx >= 0;
-                --maxNum, --taskNdx) {
+        for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
             final TaskRecord task = mTaskHistory.get(taskNdx);
             ActivityRecord r = null;
             ActivityRecord top = null;
@@ -3358,6 +3357,8 @@ final class ActivityStack {
             ci.id = task.taskId;
             ci.baseActivity = r.intent.getComponent();
             ci.topActivity = top.intent.getComponent();
+            ci.lastActiveTime = task.lastActiveTime;
+
             if (top.thumbHolder != null) {
                 ci.description = top.thumbHolder.lastDescription;
             }
index 8ad29f3..95a35de 100644 (file)
@@ -548,14 +548,43 @@ public final class ActivityStackSupervisor {
     ActivityRecord getTasksLocked(int maxNum, IThumbnailReceiver receiver,
             PendingThumbnailsRecord pending, List<RunningTaskInfo> list) {
         ActivityRecord r = null;
-        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
+
+        // Gather all of the running tasks for each stack into runningTaskLists.
+        final int numStacks = mStacks.size();
+        ArrayList<RunningTaskInfo>[] runningTaskLists = new ArrayList[numStacks];
+        for (int stackNdx = numStacks - 1; stackNdx >= 0; --stackNdx) {
             final ActivityStack stack = mStacks.get(stackNdx);
-            final ActivityRecord ar =
-                    stack.getTasksLocked(maxNum - list.size(), receiver, pending, list);
+            ArrayList<RunningTaskInfo> stackTaskList = new ArrayList<RunningTaskInfo>();
+            runningTaskLists[stackNdx] = stackTaskList;
+            final ActivityRecord ar = stack.getTasksLocked(receiver, pending, stackTaskList);
             if (isFrontStack(stack)) {
                 r = ar;
             }
         }
+
+        // The lists are already sorted from most recent to oldest. Just pull the most recent off
+        // each list and add it to list. Stop when all lists are empty or maxNum reached.
+        while (maxNum > 0) {
+            long mostRecentActiveTime = Long.MIN_VALUE;
+            ArrayList<RunningTaskInfo> selectedStackList = null;
+            for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
+                ArrayList<RunningTaskInfo> stackTaskList = runningTaskLists[stackNdx];
+                if (!stackTaskList.isEmpty()) {
+                    final long lastActiveTime = stackTaskList.get(0).lastActiveTime;
+                    if (lastActiveTime > mostRecentActiveTime) {
+                        mostRecentActiveTime = lastActiveTime;
+                        selectedStackList = stackTaskList;
+                    }
+                }
+            }
+            if (selectedStackList != null) {
+                list.add(selectedStackList.remove(0));
+                --maxNum;
+            } else {
+                break;
+            }
+        }
+
         return r;
     }