四大组件之BroadcastReceiver(一)-自定义“收音机”与发送“广播”

来源:互联网 发布:运营优化具体体现在 编辑:程序博客网 时间:2024/05/21 22:24

第1节 Broadcast Receiver概述

很多时候,我们希望一个应用程序在它没有运行起来的时候,也能感知系统状态的某些变化,如果条件合适,就让这个应用运行起来。

比如,一个拦截骚扰电话的应用,平时它可能并不需要运行起来,它只关心有电话来的时候,看看这个号码是不是骚扰电话的号码,如果是就给用户发出一个提示,如果不是,那就和它没有关系,啥也不做。

为了实现这类功能,安卓系统引入了四大组件之一的BroadcastReceiver,设计了一套广播与接收的机制,

  1. 任何应用或者安卓系统的自身组件可以像发送无线电波一样,向系统发出一条广播信息Broadcast
  2. 信息在系统中按照一定的规则传播(传播的规则稍后会详细介绍);
  3. 任何应用或者安卓系统的自身组件都可拥有一台接收机Broadcast Receiver,这台接收机会告诉安卓系统,它能接收某种特定的广播;
  4. 如果安卓系统辨别出当前系统中传播的广播,正是某台接收机关注的广播,那么它就会把接收机运行起来,让接收机决定下一步怎么做:是运行别的组件(Service或者Activity)继续进一步的响应,或者是忽略这条广播。

/*******************************************************************/
* 版权声明
* 本教程只在CSDN和安豆网发布,其他网站出现本教程均属侵权。
/*******************************************************************/

第2节 自定义Broadcast Receiver

无论是应用还是系统组件,它们定义Broadcast Receiver的方式都是一样。

定义Broadcast Receiver有两种方式,

  1. 静态定义:将Broadcast Receiver声明到AndroidManifest.xml配置文件当中,它的特点是应用不必运行起来,系统能通过配置文件的描述判断当前系统中的广播是否是这台接收机关注的;

  2. 动态定义:在代码中动态生成Broadcast Receiver,它的特点是应用要运行起来,在运行的过程当中判断当前系统中的广播是否是这台接收机关注的;

2.1 静态Broadcast Receiver

首先来看看如何定义一个静态的Broadcast Receiver

  1. 继承BroadcastReceiver类,实现它的onReceive接口,

    public class MyReceiver extends BroadcastReceiver {    public MyReceiver() {    }    //实现onReceive接口,当收到指定的广播后被触发    @Override    public void onReceive(Context context, Intent intent) {        //添加对应的逻辑处理    }}
  2. AndroidManifest.xml配置文件当中,声明创建的Broadcast Receiver

    <receiver    android:name=".MyReceiver"    android:enabled="true"    android:exported="true">    <intent-filter>        <action android:name="custom.action.mybroadcast"/> ---指定关注的广播        <category android:name="android.intent.category.DEFAULT" />    </intent-filter></receiver>

    这里intent-filter标签中的action android:name属性设置的值custom.action.mybroadcast,就是这台接收机关注的广播。

当名称为custom.action.mybroadcast的广播在系统中传播的时候,MyReceiver就会被运行起来,并触发它的onReceive()函数。开发者就需要在这里添加对应逻辑处理。

2.2 动态Broadcast Receiver

当应用运行起来以后,即使AndroidManifest.xml文件中没有声明过Broadcast Receiver也没有关系,它可以被动态的创建,

  1. 和创建静态Broadcast Receiver类似,首先要继承BroadcastReceiver类,实现它的onReceive接口,

    public class MyReceiver extends BroadcastReceiver {    public MyReceiver() {    }    //实现onReceive接口,当收到指定的广播后被触发    @Override    public void onReceive(Context context, Intent intent) {        //添加对应的逻辑处理    }}
  2. 注册Broadcast Receiver,并告诉系统这个Broadcast Receiver关注哪些广播,可以添加多种关心的广播,

    //设置过滤器,确定关心的广播IntentFilter filter = new IntentFilter();filter.addAction("custom.action.mybroadcast");//可以添加多种关心的广播filter.addAction(......);//创建ReceiverMyReceiver receiver = new MyReceiver();//注册到系统当中,完成Receiver的设置registerReceiver(receiver, filter);
  3. 使用完毕后,一定要注销Broadcast Receiver,否则系统会给出警告提示。

    unregisterReceiver(receiver);

动态的Broadcast Receiver在注册使用完成之后一定要注销,不然会占用系统资源、浪费资源。


/*******************************************************************/
* 版权声明
* 本教程只在CSDN和安豆网发布,其他网站出现本教程均属侵权。
/*******************************************************************/

  • 第1节 Broadcast Receiver概述
  • 第2节 自定义Broadcast Receiver
    • 1 静态Broadcast Receiver
    • 2 动态Broadcast Receiver
  • 第3节 发送Broadcast
    • 1 无序广播
      • 11 发送
      • 12 接收
    • 2 有序广播
      • 21 发送
      • 21 接收

更新时间 修改意见 2016-08-02 陈敏

第3节 发送Broadcast

任何应用或者安卓系统的自身组件可以向系统发出广播信息Broadcast,只要使用ContextsendBroadcast()方法就可以了,

unregisterReceiver(receiver);Intent i = new Intent("custom.action.mybroadcast");sendBroadcast(i);

发送出去的广播可以分成两类,一类是无序广播,一类是有序广播。

3.1 无序广播

这是一种不需要考虑接收者接收顺序的广播,比如说有3个接收机,都关注custom.action.mybroadcast这种广播,无所谓谁先收到谁后收到。接收机不能阻止其它接收机获取到这条广播。

3.1.1 发送

发送无序广播,只要使用ContextsendBroadcast()方法就可以了,

Intent i = new Intent("custom.action.mybroadcast");sendBroadcast(i);

3.1.2 接收

AndroidManifest.xml中声明静态Broadcast Receiver的时候,

<receiver   android:name=".MyReceiver"   android:enabled="true"   android:exported="true">   <intent-filter>       <action android:name="custom.action.mybroadcast"/>       <category android:name="android.intent.category.DEFAULT" />   </intent-filter></receiver>

就像前面介绍的那样,不用做什么特别的处理。

3.2 有序广播

这是一种需要考虑接收者接收顺序的广播,比如说有3个接收机,都关注custom.action.mybroadcast这种广播,那么安卓系统将根据这3个接收机声明的优先级进行广播的投递。

而且有序广播是可以被阻截的。

比如,一个广播按照顺序传递给3个接收机-A B C,但是B将广播拦截了,因此C将不会收到这个广播。

3.2.1 发送

Intent i = new Intent("custom.action.mybroadcast");sendOrderedBroadcast(i, null);

3.2.1 接收

接收的时候,需要给intent-filter标签设置android:priority属性,表示这个接收机的优先级。优先级从-1000到1000,数值越大,优先级越高。

<receiver   android:name=".MyReceiver"   android:enabled="true"   android:exported="true">   <intent-filter android:priority="1000">       <action android:name="custom.action.mybroadcast"/>       <category android:name="android.intent.category.DEFAULT" />   </intent-filter></receiver>

接收到广播以后,Broadcast Receiver可以将广播拦截,禁止它往下传播,

public class MyReceiver extends BroadcastReceiver {   public MyReceiver() {   }   //实现onReceive接口   @Override   public void onReceive(Context context, Intent intent) {       //禁止往下传播       abortBroadcast();   }}

如果接收机1onReceive()中,希望把数据传递给下个接收机2

  1. 接收机1可以使用setResultExtras()方法,

    public class MyReceiver1 extends BroadcastReceiver {    public MyReceiver() {    }    @Override    public void onReceive(Context context, Intent intent) {        Bundle b = new Bundle();        b.putString("data", "this data from MyReceiver");        setResultExtras(b);    }}
  2. 接收机2中,

    public class MyReceiver2 extends BroadcastReceiver {    public MyReceiver2() {    }    @Override    public void onReceive(Context context, Intent intent) {        Bundle b = getResultExtras(true);        if(b!=null)        {            //data就是前一个接收机1传来的-this data from MyReceiver            String data = b.getString("data");        }    }}

假如希望将数据放到onReceive()传入的Intent当中,是不会传递成功的,

@Overridepublic void onReceive(Context context, Intent intent) {    //这是不会成功的    intent.putExtra("data", "this data from MyReceiver");}

传递数据,一定要通过BroadcastReceiver提供的setResultExtras()方法。


/*******************************************************************/
* 版权声明
* 本教程只在CSDN和安豆网发布,其他网站出现本教程均属侵权。

*另外,我们还推出了Arduino智能硬件相关的教程,您可以在我们的网店跟我学Arduino编程中购买相关硬件。同时也感谢大家对我们这些码农的支持。

*最后再次感谢各位读者对安豆的支持,谢谢:)
/*******************************************************************/

0 0
原创粉丝点击