BroadcastReceiver
BroadcastReceiver
BroadcastReceiver是“广播接受者”,它是用来接收来自系统和应用所发出的Broadcast Intent,本质上就是一种全局的监听器,用于监听系统全局的广播消息,可以非常方便的实现系统中不同组件之间的通信。
在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能;当网络状态发生改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作;当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户及时保存进度等。
Android中的广播机制设计的非常出色,很多事情原本需要开发者自己亲自操作的,现在只需等待广播告知自己就可以了,大大减少了开发的工作量和开发周期。而作为应用开发者,就需要熟练掌握Android系统提供的一个开发利器,就是BroadcastReceiver。
实现BroadcastReceiver很简单,只需覆写BroadcastReceiver的onReceive(Context context,Intent intent)方法即可,如下:
public class MyReceiver extends BroadcastReceiver{ private static final String TAG="MyReceiver"; @Override public void onReceive(Context context,Intent intent){ String msg=intent.getStringExtra("msg"); Log.i(TAG,msg); } }
在onReceive方法内,我们可以获取随广播而来的Intent中的数据。
实现了BroadcastReceiver之后,还必须指定BroadcastReceiver能匹配的Intent,实现方式有两种:
静态注册
静态注册是在清单文件中配置,例如:
<receiver android:name=".MyReceiver"> <intent-filter> <!--指定该BroadcastReceiver所拦截的Intent的Action--> <action android:name="android.intent.action.MY_BROADCAST"/> </intent-filter> </receiver>
这种方式的注册是常驻型,也就是说当应用关闭后,如果有广播信息传来,MyReceiver也会被系统调用而自动运行。
动态注册
动态注册需要在代码中动态的指定广播要拦截的Action并注册,调用BroadcastReceiver的Context的registerReceiver(BroadcastReceiver receiver,IntentFilter filter)方法指定,通常我们是在Activity或Service中注册一个广播。代码如下:
MyReceiver receiver=new MyReceiver(); IntentFilter filter=new IntentFilter(); filter.addAction("android.intent.action.MY_BROADCAST"); registerReceiver(receiver,filter);
说明:registerReceiver是android.content.ContextWrapper类中的方法,Activity和Service都继承了ContextWrapper,所以可以直接调用。在实际应用中,我们在Activity或Service中注册了一个BroadcastReceiver,当这个Activity或Service被销毁时如果没有解除注册,系统会报一个异常,提示我们是否忘记了解除注册。所以,记得在特定的地方执行解除注册操作:
@Override protected void onDestory(){ super.onDestory(); unregisterReceiver(receiver); }
动态注册方式与静态注册相反,不是常驻型的,也就是说广播会跟随程序的生命周期。
我们可以根据以上任意一种方法完成注册,当注册完成之后,这个接收者就可以正常工作了。我们可以用以下方式发送一条广播:
1 public class BroadCastActivity extends Activity{ 2 Button send; 3 @Override 4 public void onCreate(Bundle savedInstanceState) 5 { 6 super.onCreate(savedInstanceState); 7 setContentView(R.layout.main); 8 //获取程序界面中的按钮 9 send=(Button)findViewById(R.id.send); 10 send.setOnClickListener(new OnClickListener() 11 { 12 @Override 13 public void onClick(View v){ 14 Intent intent=new Intent(); 15 //设置Intent的Action属性 16 intent.setAction("android.intent.action.MY_BROADCAST"); 17 intent.putExtra("msg","hello receiver"); 18 //发送广播 19 sendBroadcast(intent); 20 } 21 }); 22 } 23 }
sendBroadcast也是android.content.ContextWrapper类中的方法,它可以将一个指定Action和参数信息的Intent对象以广播的形式发送出去,当应用程序发出一个Broadcast Intent之后,所有匹配该Intent指定的Action的BroadReceiver都有可能被启动。如果有多个接收者都注册了指定的Action,会是什么情况呢?能同时接收到同一条广播吗?相互之间会不会有干扰呢?这就涉及到了普通广播和有序广播的概念了。
普通广播(Normal Broadcast):
普通广播对于多个接受者来说是完全异步的,可以在同一时刻(逻辑上)被所有的接收者接收到,消息传递的效率比较高。但缺点是接收者不能将处理结果传递给下一个接收者,并且无法终止Broadcast Intent的传播。
有序广播(Ordered Broadcast):
有序广播的接收者将按预先声明的优先级依次接收广播。优先级的声明在<intent-filter.../>元素的android:priority属性中,数越大优先级别越高,取值范围为-1000~1000,优先级别也可以调用IntentFilter对象getPriority()进行设置。广播接收者可以终止Broadcast Intent的传播(使用abortBroadcast();),那么后面的接接收者就无法接收到广播。另外,广播接收者可以将数据传递给下一个接收者,如:A得到广播后,可以往它的结果对象中通过setResultExtras(Bundle)方法存入数据,当广播传递给B时,B可以从A的结果集对象中通过代码:Bundle bundle=getResultExtras(true)得到A存入的数据。
Context提供如下两个方法用于发送广播。
sendBroadcast():发送普通广播
sendOrderedBroadcast():发送有序广播
本文主要参考自:http://blog.csdn.net/liuhe688/article/details/6955668
以及《疯狂Android讲义》