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

Posted 悠然红茶

tags:

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

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

 

侯 亮

 

1 概述

        我们在编写android程序时,常常会用到广播(Broadcast)机制。从易用性的角度来说,使用广播是非常简单的。不过,这个不是本文关心的重点,我们希望探索得再深入一点儿。我想,许多人也不想仅仅停留在使用广播的阶段,而是希望了解一些广播机制的内部机理。如果是这样的话,请容我斟一杯红茶,慢慢道来。

        简单地说,Android广播机制的主要工作是为了实现一处发生事情,多处得到通知的效果。这种通知工作常常要牵涉跨进程通讯,所以需要由AMS(Activity Manager Service)集中管理。

 

        在Android系统中,接收广播的组件叫作receiver,而且receiver还分为动态和静态的。动态receiver是在运行期通过调用registerReceiver()注册的,而静态receiver则是在AndroidManifest.xml中声明的。动态receiver比较简单,静态的就麻烦一些了,因为在广播递送之时,静态receiver所从属的进程可能还没有启动呢,这就需要先启动新的进程,费时费力。另一方面,有些时候用户希望广播能够按照一定顺序递送,为此,Android又搞出了ordered broadcast的概念。

        细节如此繁杂,非一言可以说清。我们先从receiver这一侧入手吧。

 

2 两种receiver

        Android中的receiver,分为“动态receiver”和“静态receiver”。

2.1 动态receiver

        动态receiver必须在运行期动态注册,其实际的注册动作由ContextImpl对象完成:

?
1 2 3 4 5 6 7 8 9 10 11 12 @Override public  Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter)            return  registerReceiver(receiver, filter,  null null ); @Override public  Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,                                 String broadcastPermission, Handler scheduler)           return  registerReceiverInternal(receiver, filter, broadcastPermission,                                      scheduler, getOuterContext());

注册之时,用户会把一个自定义的receiver对象作为第一个参数传入。当然,用户的receiver都是继承于BroadcastReceiver的。使用过广播机制的程序员,对这个BroadcastReceiver应该都不陌生,这里就不多说了。我们需要关心的是,这个registerReceiverInternal()内部还包含了什么重要的细节。

        registerReceiverInternal()代码的截选如下:

?
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 private  Intent registerReceiverInternal(BroadcastReceiver receiver,                                          IntentFilter filter, String broadcastPermission,                                          Handler scheduler, Context context)       IIntentReceiver rd =  null ;          if  (receiver !=  null                        if  (mPackageInfo !=  null  && context !=  null                                    if  (scheduler ==  null                               scheduler = mMainThread.getHandler();                                        // 查找和context对应的“子哈希表”里的ReceiverDispatcher,如果找不到,就重新new一个              rd = mPackageInfo.getReceiverDispatcher(receiver, context, scheduler,                                                      mMainThread.getInstrumentation(),  true );                     . . . . . .                try  品茗论道说广播(Broadcast内部机制讲解)(下)

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

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

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

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

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

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