开始
广播机制在程序之间的交互中使用,每个程序都可以发送和接收广播,在程序内也可通过广播实现 Activity 通信
广播的类型
-
标准广播
标准广播是一种异步执行的广播,广播发出后,所有 Receiver 都会同时接收到这条广播,该类型的广播无法被截断
-
有序广播
有序广播是一种同步执行的广播,广播的接收按 Receiver 的优先级决定,同时每个 Receiver 可以决定该广播是否继续传播
-
显式广播
显式广播是指定了要发送的应用程序的广播
-
隐式广播
隐式广播没有指定发送的应用程序,指定了一些信息,发送给符合信息的应用程序
广播的注册
广播注册分为动态注册和静态注册两种,动态注册可以实现灵活的广播注册和注销,但必须要程序启动后才能接收到广播。若要在程序未启动时,比如刚开机的情况下接受到系统的开机广播,就需要使用静态注册,但静态注册长期监听,消耗更多资源,因此大部分情况建议优先使用动态注册解决问题
定义广播接收器:自定义类继承 BroadcastReceiver
,重写 onReceive
方法
1 | public class MyReceiver extends BroadcastReceiver { |
动态注册
在 Activity 运行时将一个 BroadcastReceiver
注册为接收器
- 构造
IntentFilter
对象,调用addAction()
添加 action,指定 Receiver 接收的广播类型 - 构造接收器对象
- 调用
registerReceiver()
,传入接收器和IntentFilter
- 调用
unregisterReceiver()
注销接收器
1 | IntentFilter filter = new IntentFilter(); |
静态注册
在 AndroidManifest.xml
中 application
标签中的 receiver
标签中注册
receiver
标签
name
:指定自定义广播接收器类exported
:是否允许该 Receiver 接收本程序以外的广播enabled
:是否启用该 Receiverintent-filter
:在该标签中添加action
标签来指定接收的广播类型
静态接收器由于会消耗资源一直监听,因此许多系统广播不允许静态接收器监听,允许监听的系统广播需要添加权限
静态接收器不能接收隐式广播
发送自定义广播
发送标准广播
构造 Intent 对象,传入自定义广播的 action 值,所有监听该 action 值的 Receiver 就会收到消息
1 | // 发送广播 |
发送有序广播
在发送广播时调用 sendOrderedBroadcast()
发送有序广播,传入 intent 和关于权限的字符串,设为 null 即可
调用 abortBroadcast()
可将广播截断
1 | // 发送广播 |
本地广播
本地广播是指只在本应用程序内发送和接收的广播,其他程序不能接收本程序的本地广播
通过 LocalBroadcastManager
来发送广播
1 | // 获取LocalBroadcastManager实例 |