一、定义
- BroadcastReceiver (广播接收器),android四大组件之一
- BroadcastReceiver的应用场景非常多,是一个全局的监听器,属于android四大组件之一
二、作用
- 监听/接受应用发出的广播消息,并做出响应
- 应用场景:
a:不同组件之间通信(包括应用内/不同应用之间)
b:与android系统在特定情况下通信,如当电话呼入时、网路可用时
c:多线程通信
三、实现原理
- android中的广播使用了设计模式中的观察者模式:基于消息的发布/订阅事件模型
因而,android将广播的发送者和接受者解耦,是的系统方便集成,更易扩展。
- 模型中有3个角色:
消息订阅者(广播接受者)、消息发布者(广播发布者)、消息中心(AMS,即Activity Manager Service)
(图片来源:)

- 原理描述:
i:广播接受者通过Binder机制在AMS注册
ii:广播发送者通过Binder机制向AMS发送广播
iii:AMS根据广播发送者要求,在已注册列表中,寻找合适的广播接受者:寻找依据:IntentFilter/Permission
iv:AMS将广播发送到合适的广播接受者相应的消息循环队列中
v:广播接受者通过消息循环拿到此广播,并回调onReceive()
注意:广播发送者和广播接受者的执行时异步的,发出去的广播不会关心有无接受者接受,也不确定接受者到底何时才能接受到。
(广播接受者运行在主进程,广播接受者的onReceive()方法不能有耗时操作, 因为broadcastReceiver的ANR只是只有10s,并且onReceive()方法运行时间很短,因而在其中开启线程容易导致onReceive()方法结束,但子线程没有结束,此时子线程就会被杀掉。)
四、具体使用
4.1自定义广播接受者BroadcastReceiver
- 继承自BroadcastReceiver基类
- 必须重写抽象方法onReceive()方法
i:广播接受器接收到相应广播,就会自动调用onReceive()方法
ii:一般情况下,onReceive方法会涉及与其他组件之间的交互,如发送Notification、启动service等
iii:默认情况下,广播接受器运行在UI线程,因而,onReceive()方法不能执行耗时操作,否则将导致ANR。
4.2广播接收器注册
注册的方式分为两种:静态注册、动态注册
4.2.1静态注册
- 在AndroidManifest.xml里通过<receive>标签声明
该注册方法是在此APP首次启动时,系统会自动实例化MBroadcastReceiver类,并注册到系统中。
4.2.2动态注册
- 在代码中通过调用Context的registerReceiver()方法进行动态注册BroadcastReceiver
注意:动态广播最好在Activity的onResume()注册,onPause()注销
因为:对于动态广播,有注册就必然得有注销,否则会导致内存泄漏(重复注册、重复注销也不允许。)
4.2.3两种注册方式的区别
静态广播(常驻广播):
- 优点:常驻,不收任何组件的生命周期影响(应用程序关闭后,如果有消息广播来,程序依旧会被系统调用)
- 缺点:耗电、占内存
- 应用场景:需要时刻监听广播
动态广播(非常驻广播)
- 优点:非常驻,灵活,跟随组件的生命周期变化(组件结束=广播结束,在组件结束前,必须移除广播接受器)
- 应用场景:需要特定时刻监听广播