对于无需广播来说,对应的BroadcastReciver的执行顺序到底是什么样子?真的是完全无序,无规律可循么?
在Android中,每次发送一个广播的时候,都会为其查询相匹配的BroadcastRrceiver队列。
分别存储在两个队列里。
// Figure out who all will receive this broadcast.
List receivers = null;
List<BroadcastFilter> registeredReceivers = null;
...
receivers = collectReceiverComponents(intent, resolvedType, callingUid, users);
registeredReceivers = mReceiverResolver.queryIntent(intent,
resolvedType, false, userId);
把静态注册的广播存放在receivers中,接口collectReceiverComponents 通过PackageManager获取了与这个广播匹配的静态BroadcastReceiver信息。
registeredReceivers是所有动态注册的,对这个广播感兴趣的receiver,通过接口mReceiverResolver.queryIntent(intent, resolvedType, false, users[i]);获得。
源码告诉我们一个事实,静态注册的广播由PackageManager管理,而动态注册的广播则由Resolver管理。
如果广播是无序的,那么所有的registeredReceivers都会一次性被处理,因为所有的动态注册的广播,他们的进程都是活着的,直接让他们去处理就好了。但是这一条对于静态注册的广播不适用。这是因为静态注册的广播,我们无法知道他到底进程是否存活,而如果都不是活着的,需要先把进程拉起来,一次性拉起很多进程,这是性能上无法忍受的。所以静态注册的广播,不能像动态注册的广播那样一次性执行。发送无须广播时候,静态注册的Recevier的执行是这样的,按照receivers队列,依次检查队列里面的Receiver是否存活,如果是活着的,则执行该Recevierd的OnReceiver回调,如果进程尚不存在,则首先创建进程,然后执行BroadcastReceiver的OnRecevier 回调,当一个BroadcastReceiver执行完,再去执行receivers队列里的下一个BroadcastReceiver。而receivers队列是按照优先级排列的。
那么对于无序广播来说,BroadcastReceiver的执行顺序就明确了:
1. 所有的动态注册的BroadcastRecevier,会被一起执行,他们执行的顺序是不固定的,由Android的进程调度决定。
2. 当动态注册的BroadcastRecevier被执行完以后,会按照优先级,依次执行静态注册的BroadcastReceiver。