Broadcast广播的分类

   BroadcastReceiver(广播接收器),属于 Android 四大组件之一。在分析ANR产生原因时,涉及到部分广播的知识,我将针对广播类型,做个记录:

1. 普通广播(Normal Broadcast)

即开发者自身定义intent的广播(最常用),也就是并行广播。发送广播使用如下:

Intent intent = new Intent();
//对应BroadcastReceiver中intentFilter的action
intent.setAction(BROADCAST_ACTION);
//发送广播
sendBroadcast(intent);

2. 有序广播(Ordered Broadcast)


定义(也就是串行广播)::
发送出去的广播被广播接收者按照先后顺序接收
有序是针对广播接收者而言的

广播接受者接收广播的顺序规则(同时面向静态和动态注册的广播接受者)

按照Priority属性值从大-小排序;
Priority属性相同者,动态注册的广播优先;
特点:

接收广播按顺序接收
先接收的广播接收者可以对广播进行截断,即后接收的广播接收者不再接收到此广播;
先接收的广播接收者可以对广播进行修改,那么后接收的广播接收者将接收到被修改后的广播
具体使用
有序广播的使用过程与普通广播非常类似,差异仅在于广播的发送方式:
 

sendOrderedBroadcast(intent);

3、前台广播和后台广播


        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
 

你可能感兴趣的:(安卓,android)