广播介绍
Android中广播主要分为:有序广播、无序广播、粘性广播、局部广播。当然粘性广播也可以分为有序粘性广播和无序粘性广播,在这里我们探讨一下有序广播和无序广播。
· 普通广播(Normal Broadcast):用sendBroadcast()方法发送。
普通广播是完全异步的,逻辑上可以在同一时刻被所有匹配的接受者接收到,消息传递效率高,缺点是接受者不能将处理结果传递给下一个接收者,也无法终止广播传播。
· 有序广播(Ordered Broadcast):用sendOrderedBroadcast()方法发送。
有序广播的接收者们将按照事先生命的优先级依次接收,数越大优先级越高(取值范围:-1000~1000),优先级可以声明 在,也可以调用IntentFilter对象的setPriority设置。并且接收者可以终止 传播(调用abortBroadcast()方法即可终止),一旦终止后面接收者就无法接受广播。另外,接受者可以将处理结果存入数据(可通过 setResultExtras(Bundle)方法将数据存入Broadcast),当做Broadcast再传递给下一级接收者(可通过代码 Bundle bundle = getResultExtras(true)获取上一级传递过来的数据)。
一、动态广播优先级
②无序广播以并行或者无序方式发送,无优先级
③有序广播按照串行方式发送,有优先级
二、静态广播优先级
①无序广播并行或者无序发送
②有序广播串行方式执行,如果是同等优先级,按照app安装的先后执行,因为静态广播注册到系统中,由PMS管理。
三、静态广播与动态广播的优先级
①对于无序广播,动态广播优先发送
②对于有序广播,动态广播和静态广播按照优先级合并之后发送,此外,如果优先级相同(算法决定),那么依然是动态态广播先接收
四、核心源码分析
ActivityManager.java
// Figure out who all will receive this broadcast.
List receivers = null; //动态+静态广播
List registeredReceivers = null; //动态广播
// Need to resolve the intent to interested receivers...
if ((intent.getFlags()&Intent.FLAG_RECEIVER_REGISTERED_ONLY)
== 0) {
receivers = collectReceiverComponents(intent, resolvedType, callingUid, users);
}