【Android】四大组件之一:BroadcastReceiver

BroadcastReceiver是Android一个重要的组件,代表广播消息接收器,从代码实现角度来看,BroadcastReceiver非常类似于事件编程中的监听器。不过与普通事件监听器不同的是:普通事件监听器监听的事件源是程序中的对象,比如Button、TextView等各组件,而BroadcastReceiver监听的事件源是Android中的其他组件,比如WiFi、蓝牙、系统联系人等等组件

在Android中,广播可以分为两种:一种是系统自带的广播(系统中自带大量的广播,这些广播是由操作系统发送的,我们只需要注册一个BroadcastReceiver程序接收广播即可),还有一种就是我们可以自己定义的广播(自己定义的广播由我们自己控制什么时候发送广播)。

自定义广播

如果是自定义广播,一般需要以下几个步骤:

  1. 定义广播的action字符串,注意该字符串不能与系统自带的广播action字符串相同。

    // 定义action字符串,值可以随便填,但不能与系统自带的字符串相同
    private String actionString = "zhe.li.sui.bian.tian";
  2. 定义广播接收类

    public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,
                "接收到的Action是" + intent.getAction() + ",接收到的内容是:" + intent.getStringExtra("msg"),
                Toast.LENGTH_LONG).show();
    }
    }
  3. 注册广播

    注册广播有两种方法,一种是用Java代码,另外一种是在AndroidMainfest.xml里面配置。

    • xml配置,注意这里的action值要和之前定义的actionString变量保持一致。

      <receiver android:name=".MyBroadcastReceiver">
      <intent-filter>
          <action android:name="zhe.li.sui.bian.tian" />
      </intent-filter>
      </receiver>
    • Java代码

      //注册广播
      IntentFilter intent = new IntentFilter();
      intent.addAction(actionString);
      MyBroadcastReceiver receiver = new MyBroadcastReceiver();
      registerReceiver(receiver, intent);
  4. 发送广播

    sendBroadcast(new Intent(actionString));

系统广播

和自定义广播使用方法差不多,不过系统的广播不允许我们在代码中发送,系统广播都由系统根据系统的变化自动发送,如果我们强行调用sendBroadcast是会报错的。这个其实不难理解,比如说我们开启蓝牙的时候,系统会发一条广播出来,如果允许你随便发送,结果你明明没有开启,你发送一条广播出来告诉我,你把蓝牙开了,你忽悠谁呢啊。。

有序广播

Broadcast被分为如下两种广播:

  1. Normal Broadcast(普通广播):普通广播是完全异步的,可以在同一时刻被所有广播接收者接收到,广播接受者之间无任何联系,这种广播消息传递的效率比较高,但缺点是接收者不能将处理结果传递个下一个接收者,并且无法终止Broadcast Intent的传播。

  2. Ordered Broadcast(有序广播):有序广播的接收者将按预先声明的优先级依次接收Broadcast。如:A的级别高于B,B的优先级别高于C,那么Broadcast先传给A,再传给B,最后传给C。相比普通广播的话,有序广播有以下特性:

    • 优先级别声明在<intent-filter.../>元素的android:priority属性中,数越大优先级别越高,取值范围为-1000到1000

    • Ordered Broadcast的接收者可以终止Broadcast Intent的传播,比如广播传给A,A处理之后他终止了,这样后面的接收者B和接收者C就都接收不到广播了

    • Ordered Broadcast的接收者可以将数据传递给下一个接收者,比如A得到广播之后,可以将A的相关数据保存在广播中,这样再往下传的时候B就可以接收到A存入的数据了。

Context提供了下面两个方法分别用于发送普通广播和有序广播

  1. sendBroadcast():发送普通广播

  2. sendOrderedBroadcast():发送有序广播

下面讲解下有序广播的使用方法,包括以下几点:

  1. 定义两个有序广播的接收者

    public class MyReceive1 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 创建一个Bundle对象,并存入数据
        Bundle bundle = new Bundle();
        bundle.putString("first", "第一个BroadcastReceiver存入的数据");
        //将bundle放入结果中
        setResultExtras(bundle);
    
        //取消Broadcast的继续传递
    //        abortBroadcast();
    }
    }
    public class MyReceiver2 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle bundle = getResultExtras(true);
        // 解析前一个BroadcastReceiver所存入的key为first的数据
        String first = bundle.getString("first");
        Log.e("BroadcastReceiver", "第一个BroadcastReceiver存入的消息为:" + first);
    }
    }
  2. 注册广播并设置广播接收的优先级别,这里我们可以直接xml文件中设置,也可以用代码来设置

    • XML代码设置

          <receiver android:name=".MyReceive1">
              <intent-filter android:priority="100">
                  <action android:name="you_xu_guang_bo"/>
              </intent-filter>
          </receiver>
          <receiver android:name=".MyReceiver2">
              <intent-filter android:priority="0">
                  <action android:name="you_xu_guang_bo"/>
              </intent-filter>
          </receiver>
    • Java代码设置

          //注册广播
          IntentFilter intentFilter1 = new IntentFilter();
          intentFilter1.setPriority(100);
          intentFilter1.addAction("you_xu_guang_bo");
          registerReceiver(new MyReceive1(), intentFilter1);
      
          IntentFilter intentFilter2 = new IntentFilter();
          intentFilter2.setPriority(0);
          intentFilter2.addAction("you_xu_guang_bo");
          registerReceiver(new MyReceiver2(), intentFilter2);
  3. 发送广播

    sendOrderedBroadcast(new Intent("you_xu_guang_bo"), null);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值