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<BroadcastRecord> 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<BroadcastRecord> 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

Broadcast广播的分类相关推荐

  1. 张萌韩墨羽——BroadCast 广播

    BroadCast 广播 广播作用以及机制 其实BroadcastReceiver就是应用程序间的全局大喇叭,即通信的一个手段, 系统自己在很多时候都会发送广播,比如电量低或者充足,刚启动完,插入耳机 ...

  2. Broadcast广播-Android

    一.Broadcast 1.定义 在 Android 中,Broadcast 是一种在应用程序之间传输信息的机制,要发送的广播内容是一个 Intent,这个 Intent 中可以携带我们要传送的数据. ...

  3. Upd通信之QUdpSocket的unicast单播、broadcast广播、multicast组播

    简 述: 了解Upd通信之QUdpSocket的unicast单播.broadcast广播.multicast组播,书写一个简单地例子:然后写了一个小的Qt例子,用来实现和验证它的空间的一些属性和功能 ...

  4. 【Android入门】5、Broadcast 广播、Kotlin 的高阶函数、泛型、委托

    六.BroadCast 广播 广播用于在Android系统内实现通知,概念较为简单 为了实现上述效果, 代码如下 基础类如下, 定义了receiver, 当收到消息时, 触发receiver逻辑(弹窗 ...

  5. Android Studio 单刷《第一行代码》系列 07 —— Broadcast 广播

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

  6. Android Broadcast广播机制分析

    基于Android 6.0的源码剖析, 分析android广播的发送与接收流程. 一.概述 广播(Broadcast)机制用于进程/线程间通信,广播分为广播发送和广播接收两个过程,其中广播接收者Bro ...

  7. 用Broadcast广播在activity之间、fragment之间、activity和fragment之间相互传数据

    例如:A界面要收到B界面的更变信息 一.A界面注册广播 private static final String INTENT_BROADCAST = "android.intent.acti ...

  8. Android开发学习—— Broadcast广播接收者

    1.现实中:电台要发布消息,通过广播把消息广播出去,使用收音机,就可以收听广播,得知这条消息.    Android中:系统在运行过程中,会产生许多事件,那么某些事件产生时,比如:电量改变.收发短信. ...

  9. 【转】 android之如何在两个activity之间传递handler_利用broadcast广播机制

    原文:http://blog.csdn.net/jason0539/article/details/18075293 这算是如何在两个activity之间传递handler的解决方案二了,解决方案一见 ...

最新文章

  1. 干货收藏 | 计算机学习绝对不能错过的10大网站(内附网站链接)
  2. 资源丨机器学习进阶路上不可错过的28个视频
  3. 计算机组成原理A原是什么,计算机组成原理A
  4. 我国近四成程序员单身 盘点各国IT从业者生存现状
  5. Jupyter 配置 Java环境,写Java代码,测试成功
  6. 实体类的动态生成(二)
  7. js获取日期实例之昨天今天和明天、后天
  8. 什么是函数式编程思维?
  9. Struts2中Action接收参数的方法
  10. 洛谷—— P2251 质量检测
  11. 深度强化学习之稀疏奖励(Sparse Reward)
  12. 软件观念革命:交互设计精髓_交互的学习与应用指南
  13. java简单计算器实现
  14. Hadoop | 初学基础原理
  15. codeforce 379C New Year Ratings Change 题解
  16. 3.2.2 方法的重写 3.2.3 super关键字
  17. 2012-11-26四六级词汇#9317;-----…
  18. 最小公共子串——力扣
  19. ContextMenu(上下文菜单)的用法
  20. 27岁程序员转职赏金猎人:一个漏洞10万美元,比工资香多了

热门文章

  1. oracle标志位作用是什么意思,oracle实现查询某状态标志位最大连续出现次数
  2. 无法安装64位版本的office_手机微信有两个版本,32位和64位,你的微信是多少位?...
  3. 最新!又一批高校官宣:推迟开学!各地政策如何安排?
  4. python牛顿迭代法求平方根_牛顿迭代法计算平方根
  5. 弘辽科技:京东店铺布局,打破无流量无转化局面
  6. amd显卡对linux兼容,SteamOS添加对AMD及Intel显卡支持
  7. mysql修改主服务器地址,怎么修改mysql服务器地址
  8. windows socket网络编程一:最简单的服务器和客户端搭建
  9. 2019将会是社交新零售的黄金时代
  10. 网站快照回档如何处理