• 广播的概念

    • 现实中:我们常常使用电台通过发送广播发布消息,买个收音机,就能收听
    • 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. Web APi之认证(Authentication)两种实现方式后续【三】(十五)

    前言 之前一直在找工作中,过程也是令人着实的心塞,最后还是稳定了下来,博客也停止更新快一个月了,学如逆水行舟,不进则退,之前学的东西没怎么用,也忘记了一点,不过至少由于是切身研究,本质以及原理上的脉络 ...

  2. jQuery的Internal DSL

    JQuery的核心理念是write less,do more(写的更少,做的更多),那么链式方法的设计与这个核心理念不谋而合.那么从深层次考虑这种设计其实就是一种Internal DSL. DSL是指 ...

  3. MVVM 开发的几种模式讨论(WPF)

    在WPF系(包括SL,WP或者Win8)应用开发中,MVVM是个老生常谈的问题.初学者可能不会有感觉,但当你写一个核心逻辑能在各种平台上无缝移植,而只需改改UI的时候,那种快感是无法用语言来形容的. ...

  4. Android随笔之——按键长按事件onKeyLongPress

    现在安卓手机实体键是越来越少了,但还是有的,恰好自己就碰上了:按键的长按事件...百度了一些博客,内容都基本上是完全一样的,虽然可以捕获到长按事件,但却会和正常的单击冲突.幸好最近开个VPN,goog ...

  5. Android随笔之——静默安装、卸载

    随笔之所以叫随笔,就是太随意了,说起来,之前的闹钟系列随笔还没写完,争取在十月结束之前找时间把它给写了吧.今天要讲的Android APK的静默安装.卸载.网上关于静默卸载的教程有很多,更有说要调用隐 ...

  6. PHP中curl_init函数用法

    使用PHP的cURL库可以简单和有效地去抓网页.你只需要运行一个脚本,然后分析一下你所抓取的网 页,然后就可以以程序的方式得到你想要的数据了.无论是你想从从一个链接上取部分数据,或是取一个XML文件并 ...

  7. 使用fiddler的autoResponder及设置手机端代理实现远程调试,出现的问题及解决办法

    这是开通博客的第一篇随笔,好鸡冻哈哈o_O 首先是下载安装,我安装的是最新的v4.6.2.0版本,大家在百度上搜fidddler4在百度软件中心普通下载就可以了.或者直接用这个连接:http://dl ...

  8. 在Mac下运行ASP.NET Core应用程序

    在Mac下运行ASP.NET Core应用程序 通过参照.NET Core相关官方文档,在我的Mac电脑上用Visual Studio Code创建了我的第一个ASP.NET应用. 开发环境搭建 首先 ...

  9. Oracle Client安装与基本配置

    1. 安装Oracle Client, 访问Oracle站点下载Oracle Database 11g Release 2 Client 或者(直接下载Oracle 11gR2 Client) 2. ...

  10. 关系数据库SQL之可编程性函数(用户自定义函数)

    前言 在关系型数据库中除了前面几篇基本的数据库和数据表操作之外,还提供了可编程性的函数.存储过程.事务.触发器及游标. 本文介绍的是函数. 函数分为两种: 系统函数 用户自定义函数 准备工作 这里以银 ...