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讲义》

 

posted @ 2014-04-07 16:18  我是大嘴猴  阅读(921)  评论(0编辑  收藏  举报