BroadcastReceiver也就是“广播接收者”的意思,它是用来接收来自系统和应用中的广播。
在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件。
下面将详细的阐述如何发送Broadcast和使用BroadcastReceiver过滤接收的过程:
(1)首先在需要发送信息的地方,把要发送的信息和用于过滤的信息(如Action、Category)装入一个Intent对象,然后通过调用 sendOrderBroadcast()或sendStickyBroadcast()方法,把 Intent对象以广播方式发送出去。
(2)当Intent发送以后,所有已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,若匹配则就会调用BroadcastReceiver的onReceive()方法。所以当我们定义一个BroadcastReceiver的时候,都需要实现onReceive()方法。
注册BroadcastReceiver有两种方式
静态注册:在AndroidManifest.xml中用标签生命注册,并在标签内用标签设置过滤器。
//继承BroadcastReceiver,重写onReceiver方法
//使用过滤器,接收指定action广播
动态注册: 使用IntentFilter在代码中动态的注册一个广播
IntentFilter intentFilter = new IntentFilter();
//为BroadcastReceiver指定action,使之用于接收同action的广播
intentFilter.addAction(String);
registerReceiver(BroadcastReceiver,intentFilter);
另外值得注意的是,当我们使用动态注册时候,当这个Activity或Service被销毁时如果没有解除注册,系统会报一个异常,提示我们是否忘记解除注册了,所以我们需要在onDestroy()方法中进行解除注册,一般:在onStart中注册,onStop中取消unregisterReceiver:
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}
指定广播目标Action:Intent intent = new Intent(actionString);
并且可通过Intent携带消息 :intent.putExtra(“msg”, “hi,我通过广播发送消息了”);
发送广播消息:Context.sendBroadcast(intent )
其中在动态注册中可将BroadcastReceiver的继承类进行封装,添加构造函数和BroadcastReceiver注册
BroadcastReceiver的案例演示
首先我们创建一个类MyBroadcastReceiver用于继承BroadcastReceiver:
这里重写了一个方法就是接受广播的意图并匹配:
//定义的为:public static final String //ACTION_REGISTER_SUCCESS_FINISH="register.success.finish";
Constants.ACTION_REGISTER_SUCCESS_FINISH.equals(intent.getAction())
这里是常量:定义如下:
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null && Constants.ACTION_REGISTER_SUCCESS_FINISH.equals(intent.getAction())) {
finish();
}
}
}
(1)接下里我们就通过“动态注册”的方式使用:
private MyBroadcastReceiver receiver = new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(BmobConstants.ACTION_REGISTER_SUCCESS_FINISH); //添加action
registerReceiver(receiver, filter); //注册
(2)静态注册的话是现在清单文件中添加:
(2-1)我们就可以使用代码了:
Intent int