Android广播发送过程分析

该文章主要分析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)对象

相关文章
相关标签/搜索