广播和广播接收器

广播接收器的注册方式有两种,静态注册广播(在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中注册,然后我们自己要在<receiver>标签中添加<intent-filter>标签,在该标签中添加对应的action。静态注册广播接收器的方法中也是通过重写onReceiver()实现接收广播时的处理

(注:不要在onReceiver()中添加过多逻辑或者进行耗时操作,因为广播接收器中不允许开启线程)

三.发送广播

广播分为标准广播有序广播。它是一种可以跨进程的通信方式。

广播的发送也是要借助于 Intent 的使用。实现如下:

标准广播:

// 构建Intent对象,传入要发送的广播的action值,Intent中可以携带数据
Intent intent = new Intent("……");
// 发送广播,该方法在Context类中
sendBroadcast(intent);

有序广播:

// 构建Intent对象,传入要发送的广播的action值,Intent中可以携带数据
Intent intent = new Intent("……");
// 发送广播,该方法在Context类中
sendOrderedBroadcast(intent, null);

可以在所有接收到该广播的广播接收器中设置优先级,就是在<intent-filter>标签上添加一个属性 android:priority="100" ,其中100表示优先级的数值。然后在该广播接收器中的onReceive()方法最后加上 abortBroadcast() 即可截断广播的继续发送。

四.本地广播

本地广播:发出的广播只能在当前应用程序的内部进行传递,广播接收器只能接收来自本应用程序发出的广播,减少了安全性问题。无法通过静态注册的广播接收器接收,发送本地广播比发送系统全局广播高效。

动态注册本地广播接收器步骤如下:

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);

猜你喜欢

转载自blog.csdn.net/myCSDN1997/article/details/83749091