BroadcastReceiver(广播)

224 阅读3分钟

一、定义

  • 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两种注册方式的区别

静态广播(常驻广播)

  • 优点:常驻,不收任何组件的生命周期影响(应用程序关闭后,如果有消息广播来,程序依旧会被系统调用)
  • 缺点:耗电、占内存
  • 应用场景:需要时刻监听广播

动态广播(非常驻广播)

  • 优点:非常驻,灵活,跟随组件的生命周期变化(组件结束=广播结束,在组件结束前,必须移除广播接受器)
  • 应用场景:需要特定时刻监听广播