android组件之BroadcastReceiver

来源:互联网 发布:淘宝比较好的银饰店 编辑:程序博客网 时间:2024/04/29 20:09

1、Broadcast(广播)

      是一种广泛运用在应用程序之间传输信息的机制

2、BroadcastReceiver(广播接收者)

      是对发出来的广播进行过滤接收并响应的一类组件,它就是用来接收来自系统和应用中的广播。

3、用途

      当开机完成后系统会产生一条广播;

      当网络状态改变时系统会产生一条广播

      当电池电量改变时,系统会产生一条广播

      等等

android为什么要这样设计?

       .大大减少开发的工作量和开发周期

       .作为应用开发者,只需掌握BroadcastReceiver

使用方法:

       发送:

              .把信息装入一个Intent对象(如Action、Category)

              .通过调用相应的方法将Intent对象以广播方式发送出去

                       sendBroadcast();  //发送普通的广播

                       sendOrderBroadcast(); //发送有序广播

                       sendStickyBroadcast();  //异步广播(粘滞性滞留广播)

       接收:

               当Intent发送以后,所有已经注册的BroadcastReceiver会检查注册的IntentFilter是否与发送的Intent相匹配,         若匹配则就会调用BroadcastReceiver的onReceive()方法。所以当我们定义一个BroadcastReceiver的时候,都           需要实现onReceive()方法。

       注意:BroadcastReceiver需要注册

                 .静态注册  (在.xml注册)

                 .代码注册

         BroadcastReceiver生命周期只有十秒左右

         在BroadcastReceiver里不能做一些比较耗时的操作

          应该通过发送Intent给Service,由Service来完成

          不能使用子线程

广播的种类:

          普通广播(Normal broadcasts)

                  所有监听该广播的广播接收者都可以监听到该广播。

            有序广播(Ordered  broadcasts)

                    按照接收者的优先级顺序接收广播,优先级别在intent-filter中的priority中声明,-1000到1000之间,值越

            大,优先级越高。可以终止广播意图的继续传播。接收者可以篡改内容。

             异步广播(粘滞性滞留广播)

               不能将处理结果传给下一个接收者,无法终止广播。

 普通广播的特点:

          同级别接收先后是随机的

           级别低的后收到广播

           接受器不能截断广播的继续传播也不能处理广播

            同级别动态注册高于静态注册

有序广播的特点:

             同级别接收顺序是随机的

             能截断广播的继续传播,高级别的广播接收器接收到该广播后,可以决定把该广播是否截断。

              接收器能截断广播的继续传播,也能处理广播。

              同级别动态注册高于静态注册

demo:

package com.example.mhy.broadcast;import android.content.Intent;import android.content.IntentFilter;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;public class MainActivity extends AppCompatActivity {    /**     *广播生命周期很短只有十几秒,不能做耗时操作,     * 当主线程被杀死之后它所创建的子线程也会随之消亡     * 不能开辟子线程     * 耗时操作交给Service来做     */    private BC2 bc2;    private BC3 bc3;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //动态注册广播        bc2 = new BC2();        //新建消息过滤器        IntentFilter intentFilter0 = new IntentFilter("BC1");        registerReceiver(bc2, intentFilter0);    }    public void doClick(View v) {        switch (v.getId()) {            case R.id.send1:                Intent intent = new Intent();                intent.putExtra("msg", "这是一条普通广播");                //设置消息的唯一标志(一般以类名命名)                intent.setAction("BC1");                sendBroadcast(intent);                break;            case R.id.send2:                Intent intent2 = new Intent();                intent2.putExtra("msg","这是一条有序广播");                intent2.setAction("BC1");                sendOrderedBroadcast(intent2,null);                break;            case R.id.send3:                //滞留广播不考虑广播的发送和接收顺序                Intent intent3 = new Intent();                intent3.putExtra("msg", "发送一条滞留广播");                intent3.setAction("BC3");                sendStickyBroadcast(intent3);//过时的使用方式                IntentFilter intentFilter = new IntentFilter("BC3");                bc3 = new BC3();                registerReceiver(bc3, intentFilter);                break;        }    }    @Override    protected void onDestroy() {        super.onDestroy();        //如果为动态注册广播接收器 则使用后一定要解除注册        unregisterReceiver(bc2);    }}

package com.example.mhy.broadcast;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.Bundle;/** * Created by mhy on 2016/5/7. */public class BC1 extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        String s = intent.getStringExtra("msg");        System.out.println("receiver1收到消息:" + s);//        abortBroadcast();//        Bundle bundle = new Bundle();//        bundle.putString("test", "广播处理的数据");//        setResultExtras(bundle);    }}

package com.example.mhy.broadcast;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.Bundle;/** * Created by mhy on 2016/5/7. */public class BC2 extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        String s = intent.getStringExtra("msg");        System.out.println("receiver2收到消息:" + s);        //有序广播可以截断广播也广播之间也可以传递数据//        abortBroadcast();//        Bundle bundle = getResultExtras(true);//        String s2 = bundle.getString("test");//        System.out.println("得到的处理结果是:" + s2);    }}

package com.example.mhy.broadcast;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;/** * Created by mhy on 2016/5/7. */public class BC3 extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        System.out.println("收到了异步广播!");    }}


               

0 0