// 获取静态广播接收器mReceivers try { if (intent.getComponent() != null) { // Broadcast is going to one specific receiver class... ActivityInfoai= AppGlobals.getPackageManager(). getReceiverInfo(intent.getComponent(), STOCK_PM_FLAGS); if (ai != null) { receivers = newArrayList(); ResolveInfori=newResolveInfo(); ri.activityInfo = ai; receivers.add(ri); } } else { // Need to resolve the intent to interested receivers... if ((intent.getFlags()&Intent.FLAG_RECEIVER_REGISTERED_ONLY) == 0) { receivers = AppGlobals.getPackageManager().queryIntentReceivers( intent, resolvedType, STOCK_PM_FLAGS); } // 获取动态广播接收器mReceiverResolver registeredReceivers = mReceiverResolver.queryIntent(intent, resolvedType, false); } } catch (RemoteException ex) { // pm is in same process, this will never happen. }
intNR= 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. BroadcastRecordr=newBroadcastRecord(intent, callerApp, callerPackage, callingPid, callingUid, requiredPermission, registeredReceivers, resultTo, resultCode, resultData, map, ordered, sticky, false);
// 很明显接收到普通广播之后,在这只处理了动态广播 registeredReceivers,对于普通广播而言,动态广播接收器要优先于静态广播接收器 无关设置的优先级 booleanreplaced=false; if (replacePending) { for (int i=mParallelBroadcasts.size()-1; i>=0; i--) { if (intent.filterEquals(mParallelBroadcasts.get(i).intent)) { if (DEBUG_BROADCAST) Slog.v(TAG, "***** DROPPING PARALLEL: " + intent); mParallelBroadcasts.set(i, r); replaced = true; break; } } } if (!replaced) { mParallelBroadcasts.add(r); scheduleBroadcastsLocked(); } //将registeredReceivers置为null,后面只处理静态广播接收器,所以不会有冲突。 registeredReceivers = null; NR = 0; }
//如果是有序广播,将静态广播接收器和动态广播接收器组合成一个最终的顺序 intir=0; if (receivers != null) { ... //合并的过程,注意顺序 intNT= receivers != null ? receivers.size() : 0; intit=0; ResolveInfocurt=null; BroadcastFiltercurr=null; while (it < NT && ir < NR) { if (curt == null) { curt = (ResolveInfo)receivers.get(it); } if (curr == null) { curr = registeredReceivers.get(ir); } //如果动态广播接收器优先级高于或者等于静态广播接收器,那么就插到前面 //很明显动态的要在静态的前面 if (curr.getPriority() >= curt.priority) { // Insert this broadcast record into the final list. receivers.add(it, curr); ir++; curr = null; it++; NT++; } else { // Skip to the next ResolveInfo in the final list. it++; curt = null; } } }