• 广播的概念

    • 现实中:我们常常使用电台通过发送广播发布消息,买个收音机,就能收听
    • Android:系统在产生某个事件时发送广播,应用程序使用广播接收者接收这个广播,就知道系统产生了什么事件。Android系统在运行的过程中,会产生很多事件,比如开机、电量改变、收发短信、拨打电话、屏幕解锁
  • 广播接收者的注册

    Android四大组件都要在清单文件中注册

    广播接收者比较特殊,既可以在清单文件中注册,也可以直接使用代码注册

    有的广播接收者,必须代码注册如 电量改变,屏幕锁屏和解锁

    • 使用清单文件配置

      <receiver android:name="接收广播的实现类所在的包">
      <intnt-filter>
      <android:name="要接收的广播">
      <android:data="">
      ......
      </intent-filter>
      </receiver>
    • 通过代码的实现

      //创建广播接收者对象
      receiver = new ScreenOnOffReceiver();
      //通过IntentFilter对象指定广播接收者接收什么类型的广播
      IntentFilter filter = new IntentFilter();
      filter.addAction(Intent.ACTION_SCREEN_OFF);
      filter.addAction(Intent.ACTION_SCREEN_ON);
      //注册广播接收者
      registerReceiver(receiver, filter);
    • 解除注册广播接收者 解除注册之后,广播接收者将失去作用

      unregisterReceiver(receiver);
    • 为什么
  • 广播的接收

    在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。
    而BroadcastReceiver是对发送出来的Broadcast进行过滤接受并响应的一类组件。
    广播接收者(BroadcastReceiver)用于接收广播Intent的, 广播Intent的发送是通过调用sendBroadcast
    /sendOrderedBroadcast来实现的。通常一个广播Intent可以被订阅了此Intent的多个广播接收者所接收。
  • 实现一个BroadcastReceiver 接收BroadCast发送的广播

    需求:监听用户拨打电话,在用户拨打电话号码前自动加上17951等

    拦截的广播:

    <action android:name="android.intent.action.NEW_OUTGOING_CALL"></action>

    需要的权限:

    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>

    1.新创建一个Android工程《IPCaller》

    2.在src目录下新创建一个类IPCallerReceiver继承BroadcastReceiver,重写OnReceive方法。

    public class IPCallReveiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
    //获取拨打的电话号码
    String resultData = getResultData();
    //在电话号码前加上17951,然后返回数据
    setResultData("17951"+resultData);
    }
    }

    3.在AndroidManifest.xml中注册广播接收者

    <receiver android:name="com.itheima.ipcaller.IPCallReveiver">
    <intent-filter android:priority="1000">
    <action android:name="android.intent.action.NEW_OUTGOING_CALL"></action>
    </intent-filter>
    </receiver>

    在下面的配置文件中 <intent-filter android:priority="1000">属性代表着给当前接收者设置优先级,优先级越高越优先接收到广播(只有有序广播注册才有效)

    运行上面的代码,然后拨打电话5556,发现拨出去的号码已经变为179515556。 运行效果图如下:

  • 发送自定义广播

    • 发送无序广播

      • 无序广播不可以被拦截,如果被拦截的话会报错:
      • 无序广播可以视为所有广播接收者同时接收到广播
      • 无序广播使用sendBroadcast方法来发送

        public void sendBroadcast(View view){
        //定义一个意图
        Intent intent = new Intent();
        //设置Action 可以接受到该广播的意图过滤器
        intent.setAction("com.itheima.broadcast");
        //绑定数据
        intent.putExtra("data", "我是无序广播数据");
        //发送无序广播
        sendBroadcast(intent);
        }
    • 发送有序广播

      • 有序广播可以被拦截,且优先级搞得接收者可以拦截优先级低的
      • 广播接受者的优先级的取值范围是:1000(最高)~ -1000(最低)
      • 相同的优先级下,接收的顺序要看清单文件中的声明顺序,先声明先接收广播
      • 有序广播使用sendOrderedBroadcast()方法发送,可以使用abortBroadcast()方法拦截 *广播接收者的优先级可以在清单文件中声明接收者时,在<intent-filter>标签下通过设置“android:property”属性来设置

      我们新创建一个项目,来演示无序广播的发送和接收过程

      1. 新创建一个Android工程《广播发送和接收》,包名com.itheima.broadcastAndreceiver

      2.在默认的MainActivity的布局中添加一个按钮,绑定事件,该事件的核心功能是发送一个有序广播,MainActivity类代码清单如下:

      public class MainActivity extends Activity {
      
          @Override
      protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      }
      public void sendOrder(View view) {
      // 意图
      Intent intent = new Intent();
      //定义动作
      intent.setAction("com.itheima.data");
      //发送有序广播
      //第一个参数 Intent类型:意图
      //第二个参数 String类型 receiverPermission,接收器需要的权限
      //第三个参数BroadcastReceiver类型,自己定义的接收器作为最终接收器
      //第四个参数Handler类型,用于执行接收器的回调,如果为null则在主线程中执行
      //第五个参数int类型,结果代码的初始码
      //第六个参数初始化参数
      //第七个参数Bundle类型,额外的数据
      sendOrderedBroadcast(intent, null, null,
      null, RESULT_OK, "1万元钱", null);
      }

      3.分别编写MyReceiver和MyReceiver2类,继承BroadcastReceiver类

      MyReceiver类代码清单:

      public class MyReceiver extends BroadcastReceiver {
      @Override
      public void onReceive(Context context, Intent intent) {
      String action = intent.getAction();
      String resultData = getResultData();
      Toast.makeText(context, "MyReceiver接收到"+action+"发布的广播:"+resultData, 1).show();
      System.out.println("MyReceiver接收到"+action+"发布的广播:"+resultData);
      }
      }

      MyReceiver2类代码清单:

      public class MyReceiver2 extends BroadcastReceiver {
      @Override
      public void onReceive(Context context, Intent intent) {
      String action = intent.getAction();
      String resultData = getResultData();
      Toast.makeText(context, "MyReceiver2接收到"+action+"发布的广播:"+resultData, 1).show();
      System.out.println("MyReceiver2接收到"+action+"发布的广播:"+resultData); }
      }

      4.在AndroidManifest.xml中注册MyReceiver和MyReceiver2:

      <receiver android:name="com.itheima.broadcastAndreceiver.MyReceiver">
      <intent-filter android:priority="1000">
      <action android:name="com.itheima.data"></action>
      </intent-filter>
      </receiver>
      <receiver android:name="com.itheima.broadcastAndreceiver.MyReceiver2">
      <intent-filter android:priority="-1000">
      <action android:name="com.itheima.data"></action>
      </intent-filter>
      </receiver>

      在上面清单文件中我们给MyReceiver设置了最高优先级1000,给MyReceiver2设置了最低优先级-1000。

      5.下面我们分多钟情况,分别演示有序广播的接收规律

      直接部署上面的工程到模拟器,点击发送广播按钮,控制台结果为:

      6.修改MyReceiver类的代码:在onReceive方法中添加abortBroadcast()方法,

      public class MyReceiver extends BroadcastReceiver {
      
          @Override
      public void onReceive(Context context, Intent intent) {
      String action = intent.getAction();
      String resultData = getResultData();
      Toast.makeText(context, "MyReceiver接收到"+action+"发布的广播:"+resultData, 1).show();
      System.out.println("MyReceiver接收到"+action+"发布的广播:"+resultData);
      abortBroadcast();
      }
      }

      然重新部署该工程,运行,点击发送广播按钮。这时控制台打印信息为

      这说明优先级高的的广播接收者可以修改或拦截广播 优先级低的广播接收者收到修改后的广播或收不到广播

      7.在第二种情况的基础上,我们修改MainActivity类中sendOrder方法,修改sendOrderedBroadcast中第三个参数,指定一个最终接收器

      public void sendOrder(View view) {
      // 意图
      Intent intent = new Intent();
      intent.setAction("com.itheima.data");
      sendOrderedBroadcast(intent, null, new MyReceiver2(),
      null, RESULT_OK, "1万元钱", null);
      }

      运行上面的项目,我们可以控制台输出如下信息:

      虽然在MyReceiver中我们调用了abortBroadcast();方法,但是广播依然被MyReceiver2接收到。原因是我们在sendOrderedBroadcast方法中指定了MyReceiver2接收器为最终接收器,因此该广播被终止的时候MyReceiver2接收器依然可以接收到广播。

      8.在第3种情形的基础上,我们修改MyReceiver类,我们将该类中的onReceive方法中的abortBroadcast();方法去掉。然后运行上面工程。发现控制台输入如下信息

      我们发现MyReceiver第一个接收到广播,MyReceiver2第二个接收到广播,然后MyReceiver2又接收到一次广播。对的,结果确实是这样,因为我们在sendOrderedBroadcast方法中,将MyReceiver2作为最终接收器,那么我们发出的广播会被所有符合条件的接收器接收,最后指定的最终接收器不管是否已经接收过信息依然会再次接收。

android四大组件之Broadcast的更多相关文章

  1. [Android基础]Android四大组件之BroadCast

    BroadCast的定义: 广播是一种订阅--通知 事件,广播接收者向Android系统 register (订阅广播),广播发送者向Adnroid系统 sendBroadCast(发送广播),然后A ...

  2. 【Android开发日记】之入门篇(六)——Android四大组件之Broadcast Receiver

    广播接受者是作为系统的监听者存在着的,它可以监听系统或系统中其他应用发生的事件来做出响应.如设备开机时,应用要检查数据的变化状况,此时就可以通过广播来把消息通知给用户.又如网络状态改变时,电量变化时都 ...

  3. Android 四大组件之broadcast的理解

    Android广播的两种类型: 1.静态广播 2.动态广播 静态注册广播: Manifeast中的代码块: <receiver android:name=".broadcast.MyS ...

  4. Android四大组件之BroadCast(续)

    1.哪一个方法可以发送广播? activity.sendbroadcast or context.sentbroadcast or service.sendbroadcast 2.创建广播接受程序必须 ...

  5. Android 四大组件之service与Broadcast

    Android 四大组件之一:service: Service有五个生命周期:onCreat,onStartCommand, onBind,onUnbind, onDestroy 主要有绑定和非绑定两 ...

  6. Android四大组件之一“广播”

    前言 Android四大组件重要性已经不言而喻了,今天谈谈的是Android中的广播机制.在我们上学的时候,每个班级的教室里都会装有一个喇叭,这些喇叭都是接入到学校的广播室的,一旦有什么重要的通知,就 ...

  7. android四大组件(简单总结)

    activity 一个Activity通常就是一个单独的屏幕(窗口) Activity之间通过Intent进行通信 android应用中每一个Activity都必须要在AndroidManifest. ...

  8. 第九章:四大组件之Broadcast Receiver

    第九章:四大组件之Broadcast Receiver   一.广播的功能和特征 广播的生命周期很短,经过调用对象-->实现onReceive-->结束,整个过程就结束了.从实现的复杂度和 ...

  9. Android四大组件小结

    Android四大组件分别为activity.service.content provider.broadcast receiver. 一.android四大组件详解 1.activity (1)一个 ...

随机推荐

  1. C算法编程题(七)购物

    前言 上一篇<C算法编程题(六)串的处理> 有些朋友看过我写的这个算法编程题系列,都说你写的不是什么算法,也不是什么C++,大家也给我提出用一些C++特性去实现问题更方便些,在这里谢谢大家 ...

  2. Lua 学习笔记(六)迭代器

    一.迭代器的定义      “迭代器”就是一种可以遍历一种集合中所有元素的机制.在Lua中迭代器以函数的形式表示,即没掉用一次函数,即可返回集合中的“下一个”元素.迭代器的实现可以借助于闭合函数实现, ...

  3. 修正IE6不支持position:fixed的bug(转)

    众所周知IE6不支持position:fixed,这个bug与IE6的双倍margin和不支持PNG透明等bug一样臭名昭著.前些天我做自己的博客模板的时候,遇到了这个问题.当时就简单的无视了IE6— ...

  4. SQLServer学习笔记系列12

    一.写在前面的话 这个sql学习系列,今天准备告一段落,虽然短短的十几篇文章,深刻感受到将学习的东西记录下来,是需要一种坚持! 这些东西只有反复的学习吸收,最终沉淀下来的才是属于自己的知识.也是提醒自 ...

  5. gnuplot: 一种更为简洁的曲线,柱状图绘图软件

    gnuplot: 一种更为简洁的曲线,柱状图绘图软件 gnuplot: 一种更为简洁的曲线,柱状图绘图软件 Zhong Xiewei Wed Jun 25 gnuplot简单介绍 关于gnuplot的 ...

  6. Command and Query Responsibility Segregation (CQRS) Pattern 命令和查询职责分离(CQRS)模式

    Segregate operations that read data from operations that update data by using separate interfaces. T ...

  7. Struts2 源码分析——Action代理类的工作

    章节简言 上一章笔者讲到关于如何加载配置文件里面的package元素节点信息.相信读者到这里心里面对struts2在启动的时候加载相关的信息有了一定的了解和认识.而本章将讲到关于struts2启动成功 ...

  8. 关于dijkstra算法的一点理解

    最近在准备ccf,各种补算法,图的算法基本差不多看了一遍.今天看的是Dijkstra算法,这个算法有点难理解,如果不深入想的话想要搞明白还是不容易的.弄了一个晚自习,先看书大致明白了原理,就根据书上的 ...

  9. browserCaps与浏览器功能设置

    使用 Web.config 文件中的 browserCaps 元素来定义浏览器的行为在 .NET Framework 2.0 中被否决,但仍受支持.此元素中的数据与浏览器定义文件 (.browser) ...

  10. C# 之 DataReader 和 DataSet 的区别

    本文转载自:http://www.cnblogs.com/xinaixia/p/4920630.html 1. 获取数据的方式[1]DataReader 为在线操作数据, DataReader会一直占 ...