diff --git a/services/core/java/com/android/server/am/BroadcastProcessQueue.java b/services/core/java/com/android/server/am/BroadcastProcessQueue.java index 0cdd4e9041e96..0d4ee1da6b964 100644 --- a/services/core/java/com/android/server/am/BroadcastProcessQueue.java +++ b/services/core/java/com/android/server/am/BroadcastProcessQueue.java @@ -860,6 +860,7 @@ class BroadcastProcessQueue { static final int REASON_CONTAINS_RESULT_TO = 15; static final int REASON_CONTAINS_INSTRUMENTED = 16; static final int REASON_CONTAINS_MANIFEST = 17; + static final int REASON_FOREGROUND_ACTIVITIES = 18; @IntDef(flag = false, prefix = { "REASON_" }, value = { REASON_EMPTY, @@ -879,6 +880,7 @@ class BroadcastProcessQueue { REASON_CONTAINS_RESULT_TO, REASON_CONTAINS_INSTRUMENTED, REASON_CONTAINS_MANIFEST, + REASON_FOREGROUND_ACTIVITIES, }) @Retention(RetentionPolicy.SOURCE) public @interface Reason {} @@ -902,6 +904,7 @@ class BroadcastProcessQueue { case REASON_CONTAINS_RESULT_TO: return "CONTAINS_RESULT_TO"; case REASON_CONTAINS_INSTRUMENTED: return "CONTAINS_INSTRUMENTED"; case REASON_CONTAINS_MANIFEST: return "CONTAINS_MANIFEST"; + case REASON_FOREGROUND_ACTIVITIES: return "FOREGROUND_ACTIVITIES"; default: return Integer.toString(reason); } } @@ -959,6 +962,11 @@ class BroadcastProcessQueue { } else if (mProcessInstrumented) { mRunnableAt = runnableAt + constants.DELAY_URGENT_MILLIS; mRunnableAtReason = REASON_INSTRUMENTED; + } else if (app != null && app.hasForegroundActivities()) { + // TODO: Listen for uid state changes to check when an uid goes in and out of + // the TOP state. + mRunnableAt = runnableAt + constants.DELAY_URGENT_MILLIS; + mRunnableAtReason = REASON_FOREGROUND_ACTIVITIES; } else if (mCountOrdered > 0) { mRunnableAt = runnableAt; mRunnableAtReason = REASON_CONTAINS_ORDERED; diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java index 50d00b471f657..e651e23a5318c 100644 --- a/services/core/java/com/android/server/am/ProcessRecord.java +++ b/services/core/java/com/android/server/am/ProcessRecord.java @@ -1050,6 +1050,11 @@ class ProcessRecord implements WindowProcessListener { return mState.isCached(); } + @GuardedBy(anyOf = {"mService", "mProcLock"}) + public boolean hasForegroundActivities() { + return mState.hasForegroundActivities(); + } + boolean hasActivities() { return mWindowProcessController.hasActivities(); }