public final class ActivityManagerService extends ActivityManagerNative
implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {
......
private final int broadcastIntentLocked(ProcessRecord callerApp,
String callerPackage, Intent intent, String resolvedType,
IIntentReceiver resultTo, int resultCode, String resultData,
Bundle map, String requiredPermission,
boolean ordered, boolean sticky, int callingPid, int callingUid) {
intent = new Intent(intent);
......
//
Figure out
who
all will receive this broadcast.
List receivers = null;
List<BroadcastFilter> registeredReceivers = null;
try {
if
(intent.getComponent() != null) {
......
}
else
{
......
registeredReceivers = mReceiverResolver.queryIntent(intent, resolvedType,
false
);
}
} catch (RemoteException ex) {
......
}
final boolean replacePending =
(intent.getFlags()&Intent.FLAG_RECEIVER_REPLACE_PENDING) != 0;
int NR = registeredReceivers != null ? registeredReceivers.size() : 0;
if
(!ordered && NR > 0) {
//
If we are not serializing this broadcast,
then
send the
//
registered receivers separately so they don't wait
for
the
//
components to be launched.
BroadcastRecord r = new BroadcastRecord(intent, callerApp,
callerPackage, callingPid, callingUid, requiredPermission,
registeredReceivers, resultTo, resultCode, resultData, map,
ordered, sticky,
false
);
......
boolean replaced =
false
;
if
(replacePending) {
for
(int i=mParallelBroadcasts.size()-1; i>=0; i--) {
if
(intent.filterEquals(mParallelBroadcasts.get(i).intent)) {
......
mParallelBroadcasts.
set
(i, r);
replaced =
true
;
break
;
}
}
}
if
(!replaced) {
mParallelBroadcasts.add(r);
scheduleBroadcastsLocked();
}
registeredReceivers = null;
NR = 0;
}
......
}
......
}