BroadcastReceiver的解释
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中用标签生命注册,并在标签内用标签设置过滤器。
<receiver android:name=”myRecevice”> //继承BroadcastReceiver,重写onReceiver方法 <intent-filter> <action android:name=”com.lc.test”/> //使用过滤器,接收指定action广播 </intent-filter> </receiver>
动态注册: 使用IntentFilter在代码中动态的注册一个广播
IntentFilter intentFilter = new IntentFilter(); //为BroadcastReceiver指定action,使之用于接收同action的广播 intentFilter.addAction(String); registerReceiver(BroadcastReceiver,intentFilter);
另外值得注意的是,当我们使用动态注册时候,当这个Activity或Service被销毁时如果没有解除注册,系统会报一个异常,提示我们是否忘记解除注册了,所以我们需要在onDestroy()方法中进行解除注册,一般:在onStart中注册,onStop中取消unregisterReceiver:
() {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())
这里是常量:定义如下:
{(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); //添加actionregisterReceiver(receiver, filter); //注册
(2)静态注册的话是现在清单文件中添加:
>=>
(2-1)我们就可以使用代码了:
Intent intent = new Intent(“register.success.finish”); intent.putExtra(“msg”, “hello receiver.”); sendBroadcast(intent); //发送广播普通广播(Normal Broadcast)
普通广播对于多个接收者来说是完全异步的,通常每个接收者都无需等待即可以接收到广播,接收者相互之间不会有影响。对于这种广播,接收者无法终止广播,即无法阻止其他接收者的接收动作。为了验证以上论断,我们新建三个BroadcastReceiver,演示一下这个过程,FirstReceiver、SecondReceiver和ThirdReceiver的代码如下:
import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; {String TAG = “NormalBroadcast”;(Context context, Intent intent) {String msg = intent.getStringExtra(“msg”);Log.i(TAG, “FirstReceiver: ” + msg);} } {String TAG = “NormalBroadcast”;(Context context, Intent intent) {String msg = intent.getStringExtra(“msg”);Log.i(TAG, “SecondReceiver: ” + msg);} } {String TAG = “NormalBroadcast”;(Context context, Intent intent) {String msg = intent.getStringExtra(“msg”);Log.i(TAG, “ThirdReceiver: ” + msg);} }
然后再次点击发送按钮,发送一条广播,控制台打印如下:
看来这三个接收者都接收到这条广播了,我们稍微修改一下三个接收者,在onReceive方法的最后一行添加以下代码,试图终止广播:
abortBroadcast();
再次点击发送按钮,我们会发现,控制台中三个接收者仍然都打印了自己的日志,表明接收者并不能终止广播。
有序广播(Ordered Broadcast)诚实是人生绝妙的法宝。虽然对人诚实,