该文章主要分析Android广播发送的顺序app
一、既然分析Broadcast的发送过程,那么先从sendBroadcast(intent)源码为入口。oop
这里能够直接看(https://my.oschina.net/winHerson/blog/91150) 该博客。从该博客一路跟下来发现如下代码。 ActivityManagerService的方法ui
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) { 。。。 }
该方法作了包括不限于如下事情this
得到当前intent对应的动态和静态receiver List receivers = null; //存放当前广播对应的全部静态receiver List<BroadcastFilter> registeredReceivers = null; //存放当前广播对应的全部动态receiver //每一个BroadcastRecord 存放当前intent 和对应的动态receiver BroadcastRecord r = new BroadcastRecord(intent, callerApp, callerPackage, callingPid, callingUid, requiredPermission, receivers, resultTo, resultCode, resultData, map, ordered, sticky, false); ... mParallelBroadcasts.add(r); 存放全部无序发送的广播 //每一个BroadcastRecord 存放当前intent 和对应的静态receiver BroadcastRecord r = new BroadcastRecord(intent, callerApp, callerPackage, callingPid, callingUid, requiredPermission, receivers, resultTo, resultCode, resultData, map, ordered, sticky, false); ... mOrderedBroadcasts.add(r);存放全部有序发送的广播
而后触发spa
scheduleBroadcastsLocked();//进行广播发送
源码以下.net
private final void scheduleBroadcastsLocked() { if (DEBUG_BROADCAST) Slog.v(TAG, "Schedule broadcasts: current=" + mBroadcastsScheduled); if (mBroadcastsScheduled) { return; } mHandler.sendEmptyMessage(BROADCAST_INTENT_MSG); mBroadcastsScheduled = true; }
mBroadcastsScheduled 表示是否已经向全部运行的线程发送了一个类型为BROADCAST_INTENT_MSG的消息,从如下源码能够看出线程
final Handler mHandler = new Handler() { //public Handler() { // if (localLOGV) Slog.v(TAG, "Handler started!"); //} public void handleMessage(Message msg) { switch (msg.what) { case BROADCAST_INTENT_MSG: { if (DEBUG_BROADCAST) Slog.v( TAG, "Received BROADCAST_INTENT_MSG"); processNextBroadcast(true); } break; 。。。。 }}
而后 processNextBroadcast(true);处理每一个广播发送到对应receivercode
private final void processNextBroadcast(boolean fromMsg) { synchronized(this) { BroadcastRecord r; if (DEBUG_BROADCAST) Slog.v(TAG, "processNextBroadcast: " + mParallelBroadcasts.size() + " broadcasts, " + mOrderedBroadcasts.size() + " ordered broadcasts"); updateCpuStats(); if (fromMsg) { //(1)这里为true mBroadcastsScheduled = false; } // First, deliver any non-serialized broadcasts right away. while (mParallelBroadcasts.size() > 0) { //(2) 这里为true ,由于上面向mParallelBroadcasts添加了数据 r = mParallelBroadcasts.remove(0); r.dispatchTime = SystemClock.uptimeMillis(); final int N = r.receivers.size();///(3)这里的r.receivers.就是上面建立BroadcastRecord对象时候传入的registeredReceivers if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG, "Processing parallel broadcast " + r); for (int i=0; i<N; i++) { Object target = r.receivers.get(i); if (DEBUG_BROADCAST) Slog.v(TAG, "Delivering non-ordered to registered " + target + ": " + r); deliverToRegisteredReceiverLocked(r, (BroadcastFilter)target, false); //执行这行代码 } addBroadcastToHistoryLocked(r); if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG, "Done with parallel broadcast " + r); } // Now take care of the next serialized one... // If we are waiting for a process to come up to handle the next // broadcast, then do nothing at this point. Just in case, we // check that the process we're waiting for still exists. if (mPendingBroadcast != null) { if (DEBUG_BROADCAST_LIGHT) { Slog.v(TAG, "processNextBroadcast: waiting for " + mPendingBroadcast.curApp); } boolean isDead; synchronized (mPidsSelfLocked) { isDead = (mPidsSelfLocked.get(mPendingBroadcast.curApp.pid) == null); } if (!isDead) { // It's still alive, so keep waiting return; } else { Slog.w(TAG, "pending app " + mPendingBroadcast.curApp + " died before responding to broadcast"); mPendingBroadcast.state = BroadcastRecord.IDLE; mPendingBroadcast.nextReceiver = mPendingBroadcastRecvIndex; mPendingBroadcast = null; } } boolean looped = false; do {// mOrderedBroadcasts这里是处理有序队列的,由于上面没有传值,就不分析了 if (mOrderedBroadcasts.size() == 0) { // No more broadcasts pending, so all done! scheduleAppGcsLocked(); if (looped) { // If we had finished the last ordered broadcast, then // make sure all processes have correct oom and sched // adjustments. updateOomAdjLocked(); } return; } 。。。。。 } }
从以上源码能够看出Android是把当前的广播所有分发给每一个receiver后,才会开始处理下一条广播。 至于BroadcastReceiver 是如何具体接受广播的能够参考(http://blog.csdn.net/windskier/article/details/7251742)对象