品茗论道说广播(Broadcast内部机制讲解)(下)

Posted 悠然红茶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了品茗论道说广播(Broadcast内部机制讲解)(下)相关的知识,希望对你有一定的参考价值。

品茗论道说广播(Broadcast内部机制讲解)(下)

 

侯 亮



       下面我们来看,递送广播动作中最重要的processNextBroadcast()。

 

3.2 最重要的processNextBroadcast()

        从processNextBroadcast()的代码,我们就可以看清楚前面说的“平行广播”、“有序广播”和“动态receiver”、“静态receiver”之间的关系了。

        我们在前文已经说过,所有的静态receiver都是串行处理的,而动态receiver则会按照发广播时指定的方式,进行“并行”或“串行”处理。能够并行处理的广播,其对应的若干receiver一定都已经存在了,不会牵扯到启动新进程的操作,所以可以在一个while循环中,一次性全部deliver。而有序广播,则需要一个一个地处理,其滚动处理的手段是发送事件,也就是说,在一个receiver处理完毕后,会利用广播队列(BroadcastQueue)的mHandler,发送一个BROADCAST_INTENT_MSG事件,从而执行下一次的processNextBroadcast()。

        processNextBroadcast()的代码逻辑大体是这样的:先尝试处理BroadcastQueue中的“平行广播”部分。这需要遍历并行列表(mParallelBroadcasts)的每一个BroadcastRecord以及其中的receivers列表。对于平行广播而言,receivers列表中的每个子节点是个BroadcastFilter。我们直接将广播递送出去即可:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 while  (mParallelBroadcasts.size() >  0      r = mParallelBroadcasts.remove( 0 );      r.dispatchTime = SystemClock.uptimeMillis();      r.dispatchClockTime = System.currentTimeMillis();      final  int  N = r.receivers.size();      . . . . . .       for  ( int  i= 0 ; i<N; i++)                Object target = r.receivers.get(i);          . . . . . .          deliverToRegisteredReceiverLocked(r, (BroadcastFilter)target,  false );           . . . . . .

 

3.2.1 用deliverToRegisteredReceiverLocked()递送到平行动态receiver

        deliverToRegisteredReceiverLocked()的代码截选如下:

【frameworks/base/services/java/com/android/server/am/BroadcastQueue.java】

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 private  final  void  deliverToRegisteredReceiverLocked(BroadcastRecord r,                                                       BroadcastFilter filter,                                                        boolean  ordered)       . . . . . .      . . . . . .      if  (!skip)                if  (ordered)                        r.receiver = filter.receiverList.receiver.asBinder();              r.curFilter = filter;              filter.receiverList.curBroadcast = r;              r.state = BroadcastRecord.CALL_IN_RECEIVE;              if  (filter.receiverList.app !=  null                               品茗论道说广播(Broadcast内部机制讲解)(下)

品茗论道说广播(Broadcast内部机制讲解)(上)

详解广播机制,Broadcast Receiver,Android进阶必备知识。

详解广播机制,Broadcast Receiver,Android进阶必备知识。(附使用广播实现一键强制下线功能)

Android系统广播(Broadcast)注册,发送,接收流程解析

[源码分析] 从实例和源码入手看 Flink 之广播 Broadcast

(c)2006-2024 SYSTEM All Rights Reserved IT常识