zoukankan      html  css  js  c++  java
  • 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讲义》

     

  • 相关阅读:
    Spring实现AOP
    js Form表单转json格式,及后台接收(多种方法)
    Java 网络编程
    分布式系统学习
    java消息中间件
    oracle Clob类型转换成String类型
    Oracle的CLOB大数据字段类型
    oracle wm_concat函数 列转行 分组函数
    Oracle trunc函数使用
    ajax异步提交文件
  • 原文地址:https://www.cnblogs.com/dazuihou/p/3648891.html
Copyright © 2011-2022 走看看