diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index ede4c5ee0b701..a59395034dfa2 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -522,6 +522,7 @@ public final class ActiveServices { final ArrayList mStartingBackground = new ArrayList<>(); final ArrayMap mActiveForegroundApps = new ArrayMap<>(); + final ArrayList mPendingRemoveForegroundApps = new ArrayList<>(); boolean mActiveForegroundAppsChanged; @@ -1657,13 +1658,14 @@ public final class ActiveServices { if (smap != null) { if (DEBUG_FOREGROUND_SERVICE) Slog.d(TAG, "Updating foreground apps for user " + smap.mUserId); + smap.mPendingRemoveForegroundApps.clear(); for (int i = smap.mActiveForegroundApps.size()-1; i >= 0; i--) { ActiveForegroundApp aa = smap.mActiveForegroundApps.valueAt(i); if (aa.mEndTime != 0) { boolean canRemove = foregroundAppShownEnoughLocked(aa, now); if (canRemove) { // This was up for longer than the timeout, so just remove immediately. - smap.mActiveForegroundApps.removeAt(i); + smap.mPendingRemoveForegroundApps.add(smap.mActiveForegroundApps.keyAt(i)); smap.mActiveForegroundAppsChanged = true; continue; } @@ -1688,6 +1690,9 @@ public final class ActiveServices { } } } + for(int i = smap.mPendingRemoveForegroundApps.size() - 1; i >= 0; i--) { + smap.mActiveForegroundApps.remove(smap.mPendingRemoveForegroundApps.get(i)); + } smap.removeMessages(ServiceMap.MSG_UPDATE_FOREGROUND_APPS); if (nextUpdateTime < Long.MAX_VALUE) { if (DEBUG_FOREGROUND_SERVICE) Slog.d(TAG, "Next update time in: "