品茗论道说广播(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内部机制讲解)(下)
|