[ActivityManager] Fix the inconsistence between ProcessRecord and BroadcastQueues
Symptom:
Even though one process is executing one BroadcastReceiver,
it may be killed as one EMPTY process occasionally
Detail and sample:
https://code.google.com/p/android/issues/detail?id=221524
Root cause:
app.curReceiver can only remember the last running.
If an application is both receiving FG and BG broadcast,
when one is finished, app.curReceiver becomes null,
the state of application becomes EMPTY.
Solution:
save all running receivers at ProcessRecord
Change-Id: I01b8813af652a8c434be7de0678dc06f99831ae0
Signed-off-by: yangzhenyu <yangzhenyu@xiaomi.com>
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index 8911a3e..68de95f 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -138,7 +138,7 @@
Bundle instrumentationArguments;// as given to us
ComponentName instrumentationResultClass;// copy of instrumentationClass
boolean usingWrapper; // Set to true when process was launched with a wrapper attached
- BroadcastRecord curReceiver;// receiver currently running in the app
+ final ArraySet<BroadcastRecord> curReceivers = new ArraySet<BroadcastRecord>();// receivers currently running in the app
long lastWakeTime; // How long proc held wake lock at last check
long lastCpuTime; // How long proc has run CPU at last check
long curCpuTime; // How long proc has run CPU most recently
@@ -421,8 +421,11 @@
pw.print(prefix); pw.print(" - "); pw.println(conProviders.get(i).toShortString());
}
}
- if (curReceiver != null) {
- pw.print(prefix); pw.print("curReceiver="); pw.println(curReceiver);
+ if (!curReceivers.isEmpty()) {
+ pw.print(prefix); pw.println("Current Receivers:");
+ for (int i=0; i < curReceivers.size(); i++) {
+ pw.print(prefix); pw.print(" - "); pw.println(curReceivers.valueAt(i));
+ }
}
if (receivers.size() > 0) {
pw.print(prefix); pw.println("Receivers:");