广播接收器的注册方式有两种,静态注册广播(在AndroidManifest中注册)和动态注册广播(在Java代码中注册)。从Android8开始,取消了大多数的静态注册广播。
1.定义一个继承自BroadcastReceiver的类(可以是定义在活动类中的内部类,也可以是一个额外的java类),并重写其父类的onReceive()方法,其中onReceive()方法中就是接收到广播时的处理。
2.在活动类中声明IntentFilter引用和继承自BroadcastReceiver的类的引用,然后在活动类中的onCreate()方法中实例化IntentFilter对象,为其添加action。
3.在活动类中的onCreate()方法中实例化继承自BroadcastReceiver的类的对象,并且通过registerReceiver(BroadcastReceiver receiver,IntentFilter filter)注册广播。
4.在活动类中的onDestroy()方法中通过unregisterReceiver(BroadcastReceiver receiver)取消注册广播。
(注:动态注册的广播接收器一定要取消注册)
直接通过New->Other->Broadcast Receiver创建广播接收器,Exported属性表示是否允许接收本程序以外的广播,Enabled属性表示是否启用该广播接收器。通过这种方式创建的广播接收器会自动在AndroidManifest中注册,然后我们自己要在
广播分为标准广播和有序广播。它是一种可以跨进程的通信方式。
广播的发送也是要借助于 Intent 的使用。实现如下:
标准广播:
// 构建Intent对象,传入要发送的广播的action值,Intent中可以携带数据
Intent intent = new Intent("……");
// 发送广播,该方法在Context类中
sendBroadcast(intent);
有序广播:
// 构建Intent对象,传入要发送的广播的action值,Intent中可以携带数据
Intent intent = new Intent("……");
// 发送广播,该方法在Context类中
sendOrderedBroadcast(intent, null);
可以在所有接收到该广播的广播接收器中设置优先级,就是在
本地广播:发出的广播只能在当前应用程序的内部进行传递,广播接收器只能接收来自本应用程序发出的广播,减少了安全性问题。无法通过静态注册的广播接收器接收,发送本地广播比发送系统全局广播高效。
1.定义一个继承自BroadcastReceiver的类(可以是定义在活动类中的内部类,也可以是一个额外的java类),并重写其父类的onReceive()方法,其中onReceive()方法中就是接收到广播时的处理。
2.在活动类中声明IntentFilter引用、继承自BroadcastReceiver的类的引用和LocalBroadcastManager的引用,如下:
// 声明IntentFilter引用
private IntentFilter intentFilter;
// 声明继承自BroadcastReceiver的类的引用
private XxxReceiver xxxReceiver;
// 声明LocalBroadcastManager的引用
private LocalBroadcastManager localBroadcastManager;
3.在onCreate()中实例化上述三个引用,如下:
// 获取LocalBroadcastManager的实例
localBroadcastManager = LocalBroadcastManager.getInstance(this);
// 实例化IntentFilter对象,并为其添加action
intentFilter = new IntentFilter("……");
// 实例化广播对象
xxxReceiver = new XxxReceiver();
4.在onCreate()中注册本地广播接收器
localBroadcastManager.registerReceiver(xxxReceiver, intentFilter);
5.在onDestroy()中取消注册
localBroadcastReceiver.unregisterReceiver(xxxReceiver);
// 构建Intent对象,传入要发送的广播的action值,Intent中可以携带数据
Intent intent = new Intent("……");
// 发送本地广播
localBroadcastManager.sendBroadcast(intent);