BroadcastReceiver
(广播接收器),属于 Android
四大组件之一。在分析ANR产生原因时,涉及到部分广播的知识,我将针对广播类型,做个记录:
即开发者自身定义intent的广播(最常用),也就是并行广播。发送广播使用如下:
Intent intent = new Intent();
//对应BroadcastReceiver中intentFilter的action
intent.setAction(BROADCAST_ACTION);
//发送广播
sendBroadcast(intent);
定义(也就是串行广播)::
发送出去的广播被广播接收者按照先后顺序接收
有序是针对广播接收者而言的
广播接受者接收广播的顺序规则(同时面向静态和动态注册的广播接受者)
按照Priority属性值从大-小排序;
Priority属性相同者,动态注册的广播优先;
特点:
接收广播按顺序接收
先接收的广播接收者可以对广播进行截断,即后接收的广播接收者不再接收到此广播;
先接收的广播接收者可以对广播进行修改,那么后接收的广播接收者将接收到被修改后的广播
具体使用
有序广播的使用过程与普通广播非常类似,差异仅在于广播的发送方式:
sendOrderedBroadcast(intent);
Android的广播有前台广播和后台广播的区别,他们分别对应一个队列,前台广播对应的是前台队列,后台广播对应的是后台队列。
/**
91 * Lists of all active broadcasts that are to be executed immediately
92 * (without waiting for another broadcast to finish). Currently this only
93 * contains broadcasts to registered receivers, to avoid spinning up
94 * a bunch of processes to execute IntentReceiver components. Background-
95 * and foreground-priority broadcasts are queued separately.
96 */
97 final ArrayList mParallelBroadcasts = new ArrayList<>();
98
99 /**
100 * List of all active broadcasts that are to be executed one at a time.
101 * The object at the top of the list is the currently activity broadcasts;
102 * those after it are waiting for the top to finish. As with parallel
103 * broadcasts, separate background- and foreground-priority queues are
104 * maintained.
105 */
106 final ArrayList mOrderedBroadcasts = new ArrayList<>();
在发送广播时,可以通过设置Intent.FLAG_RECEIVER_FOREGROUND属性来将广播定义为前台广播,如果未定义,默认使用后台广播。
Intent intent = new Intent("android.intent.action.xxx");
intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
sendBroadcast(intent);
前台广播和后台广播超时时间是不一样的,前台广播是BROADCAST_FG_TIMEOUT(10s),后台广播是BROADCAST_BG_TIMEOUT(60s),这里的超时时间是指单个广播接收器可以处理的最大时间。
通过对源码的分析,可以得出一条重要的结论:只有串行队列中的接收器存在超时问题,如果是普通广播,以及动态注册的接收器是不存在超时的。
了解了超时机制,可以总结一下前台广播和后台广播。
如果我们希望广播能够更快地被接收,那么就可以将其定义成前台广播。前台广播为什么比后台广播快呢?主要有以下几点原因:
1、系统默认的广播是后台广播,因此前台广播队列比后台广播队列空闲。
2、前台广播的超时时间是10s,后台广播的超时时间是60s,开发者必须限制前台广播的数量,否则会导致ANR,同时在接收器不能有耗时的操作。
3、如果BroadcastQueue正在处理一个串行队列中的BroadRecord,当此时发送普通广播,对应动态注册的接收器还是可以收到的,有序广播或者静态注册的接收器需要排队,这也是并行处理和串行处理的区别。
具体分析,可以参考文章https://blog.csdn.net/wangsen927/article/details/116298801