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

第1节 Broadcast Receiver概述

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

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

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

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

第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标签中的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(......);
    
    //创建Receiver
    MyReceiver receiver = new MyReceiver();
    
    //注册到系统当中,完成Receiver的设置
    registerReceiver(receiver, filter);
  3. 使用完毕后,一定要注销Broadcast Receiver,否则系统会给出警告提示。
    unregisterReceiver(receiver);

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



/*******************************************************************/

* 版权声明

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

/*******************************************************************/


第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当中,是不会传递成功的,

@Override
public void onReceive(Context context, Intent intent) {

    //这是不会成功的
    intent.putExtra("data", "this data from MyReceiver");

}

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

另外,测试发现,只要不在有序广播之间传递数据,使用sendBroadcast()方法,也能成功发出有序广播。

Intent i = new Intent("custom.action.mybroadcast");
sendBroadcast(i);
时间: 2024-11-05 01:02:17

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

Android实训案例(六)——四大组件之一BroadcastReceiver的基本使用,拨号,短信,SD卡,开机,应用安装卸载监听

Android实训案例(六)--四大组件之一BroadcastReceiver的基本使用,拨号,短信,SD卡,开机,应用安装卸载监听 Android中四大组件的使用时重中之重,我这个阶段也不奢望能把他所有的原理搞懂,但是最起码的,我要把他的各种使用方法了如指掌才行 BroadcastReceiver 接收系统的广播,比如电话,短信之类的 1.IP拨号器 我们在拨打电话的时候,我们系统也会事先发送一个广播,所以我们可以用广播接收者来接收到这个广播拨打电话的时候在电话号码前面加上一些优惠的长途短号,

Android四大组件之BroadcastReceiver详细解析

什么是BroadcastReceiver? BroadcastReceiver作为Android四大组件之一,在实际开发中也发挥着重要的作用,广播机制在Android程序通信中至关重要,广播其实与我们现实生活中的电台很相似,电台在某个频道上发送它的内容,那么只要有在收听这个频道的人都会收到这些内容.在Android中,广播也同样分为两个角色:广播发送者.广播接收者. BroadcastReceiver的应用场景 1.在一个应用中,我们的Activity与Service的通信就需要用到广播来作为中

Android四大组件之BroadcastReceiver

广播接收者  现实中:电台要发布消息,通过广播把消息广播出去,使用收音机,就可以收听广播,得知这条消息 Android中:系统在运行过程中,会产生会多事件,那么某些事件产生时,比如:电量改变.收发短信.拨打电话.屏幕解锁.开机,系统会发送广播,只要应用程序接收到这条广播,就知道系统发生了相应的事件,从而执行相应的代码.使用广播接收者,就可以收听广播 创建广播接收者 1. 定义java类继承BroadcastReceiver 2. 在清单文件中定义receiver节点,定义name属性,指定广播接

Android四大组件之~~BroadcastReceiver

声明:转载请注明出处:http://blog.csdn.net/Hello_Chillax/article/details/45672601 开题:对android稍微有些了解的朋友都知道,android中有四大组件,分别是:Activity,Service,ContentProvider,BroadcastReceiver.今天来介绍其一:BroadcastReceiver. BroadcastReceiver:顾名思义,广播接收者,可以接收系统,其他应用等等发送的广播进而做出相应的反应.比如

Android 四大组件 (三) BroadcastReceiver 介绍

一. BroadcastReceiver 使用场景 Broadcast主要是用作消息通信(专业术语叫IPC),Android的IPC基本都是binder来实现,那么这里的BroadcastReceiver其实也是对binder的一个封装,方便上层调用.开发过程中遇到的单进程多线程通信的场景比较多,所以这种情况下使用Broadcast并不是最佳选择,很多人会自己实现一套 Observer 或者使用EventBus等第三方库来完成该功能,不可否认,他们在这种场合下不论是效率还是灵活性方面都更具优势.

Android 四大组件之 BroadCastReceiver

BroadCastReceiver是一种全局的监听器.用于监听系统全局的广播消息.由于他是一种全局的监听器,所以他可以轻松实现,系统中不同组件之间的通信. 1.创建BroadCastReceiver public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 当监听到广播消息时,执行这个方法. String cont

四大组件之BroadcastReceiver(二)-使用权限和常用的系统广播

第4节 Broadcast的使用权限 为广播设置权限要考虑两方面的问题. 作为广播的发送者,希望限制广播的接收者,只让特定的应用组件接收到发出的广播: 作为广播的接收者,不希望任何组件都能模仿它关心的广播,因此希望在接受广播的时候能检查一下这条广播的发送者是否具有发送这条广播的资格: 无论是上面哪种情况,解决方法都试一样的:为发送者和接收者都设置一个相同的权限,只有它们的权限匹配上了,广播机制才能产生效果. 4.1 限制接收者 假设组件A要发布广播, 在AndroidManifest.xml文件

四大组件之 BroadcastReceiver小结

总结提高,与君共勉 1. BroadcastReceiver是什么? BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来接收来自系统和应用中的广播.主要体现在: (1)当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能: (2)  当锁屏或者点亮屏幕时就会产生一条广播,接收这条广播就可以实现一些暂停或者开启一些耗电进程的功能. (3)  当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作: (4) 

android四大组件之BroadcastReceiver开机启动

和其他BroadcastReceiver一样需要配置接收的广播信息,然后配置权限 <receiver            android:name="com.example.kaijistart.BootReceiver" >            <intent-filter >                <action android:name="android.intent.action.BOOT_COMPLETED"/&g