第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接口,当收到指定的广播后被触发@Overridepublic 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接口,当收到指定的广播后被触发@Overridepublic 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和安豆网发布,其他网站出现本教程均属侵权。
/*******************************************************************/

  • 第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接口@Overridepublic void onReceive(Context context, Intent intent) {//禁止往下传播abortBroadcast();}
}

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

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

    public class MyReceiver1 extends BroadcastReceiver {public MyReceiver() {}@Overridepublic 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() {}@Overridepublic void onReceive(Context context, Intent intent) {Bundle b = getResultExtras(true);if(b!=null){//data就是前一个接收机1传来的-this data from MyReceiverString data = b.getString("data");}}
    }

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

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

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


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

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

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

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

  1. Android四大组件之BroadCastReceiver

    1. 基本概念 在Android 中,Broadcast 是一种广泛运用的在应用程序之间传输信息的机制.而BroadcastReceiver 是对发送出来的Broadcast 进行过滤接受并响应的一类 ...

  2. Android 四大组件之BroadcastReceiver

    本来想自己写一篇的,不过看到一篇讲的很详细的,这里我就转载一下分享 BroadcastReceiver(广播接收器)是Android中的四大组件之一.         下面是Android Doc中关 ...

  3. 安卓四大组件之—— BroadcastReceiver

    初识广播 什么是广播? Broadcast直译广播,我们举个形象的例子来帮我理解下BroadcastReceiver,记得以前读书 的时候,每个班级都会有一个挂在墙上的大喇叭,用来广播一些通知,比如, ...

  4. Android基础——四大组件之BroadcastReceiver

    按照顺序来,第二个是广播接收者BroadcastReceiver. BroadcastReceiver 1.Xmind 2. 注册方式 这些还是有必要具体讲一讲的 静态注册 AndroidManife ...

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

    更新时间 修改意见 2016-08-02 陈敏 第4节 Broadcast的使用权限 为广播设置权限要考虑两方面的问题. 作为广播的发送者,希望限制广播的接收者,只让特定的应用组件接收到发出的广播: ...

  6. Android四大组件之BroadcastReceiver详解

    1. 广播机制工作原理 ? 1.1 首先在需要发送信息的地方,把要发送的信息和用于过滤的信息(如Action.Category)装入一个Intent对象 1.2 然后通过调用 Context.send ...

  7. Android 四大组件丨BroadcastReceiver

    BroadcastReceiver 有几种形式及特点 BroadcastReceiver 可分为无序广播和有序广播 无序广播:通过sendBroadcast()方式发送,接收器接收顺序随机.特点是效率 ...

  8. 四大组件之BroadcastReceiver

    2019独角兽企业重金招聘Python工程师标准>>> public class MainActivity extends AppCompatActivity {@Overridep ...

  9. Android之四大组件之一-BroadcastReceiver的使用(二)

    一,广播接收器的静态注册 <!-- 静态注册 -->         <receiver android:name=".FirstReceiver">   ...

最新文章

  1. pymongo cusor not found
  2. linux文件操作命令--转
  3. 大规模微服务利器:eBPF + Kubernetes
  4. unix环境高级编程基础知识之第二篇(3)
  5. drools。drools_Drools Planner重命名为OptaPlanner:宣布www.optaplanner.org
  6. 学计算机的,怎么知道自己喜欢软件还是硬件
  7. 数据集图片批量重命名
  8. VS.NET 控件命名规范
  9. 送给python新手关于pip用法和虚拟环境用法的介绍(英文)
  10. Weak Supervision: A New Programming Paradigm for Machine Learning
  11. [2019沈阳网络赛D题]Dawn-K's water(点分治)
  12. OpenCV---圆检测
  13. CSS动态样式---基础-控制是否添加CSS类
  14. 1067 Sort with Swap(0, i) (25 分) 好,容易出错
  15. linux 美化 深度,不美翻怎么开发!Ubuntu 16.04 LTS深度美化!(2017年度定稿版)
  16. 上海电信宽带自助修复服务器,家庭网络故障自助修复法
  17. struts2拦截器的使用及作用
  18. the JDBC Driver has been forcibly unregistered.
  19. 程序员数学(15)--分式
  20. android打包绕过签名,实战android打包和签名

热门文章

  1. 【天体学】基于matlab GUI太阳天顶角计算【含Matlab源码 2229期】
  2. 织梦二次开发常用到的标签【特别实用必收藏】
  3. 淘宝广告框案例(jQuery)
  4. 广发信用卡分期计算方法,不懂的来看看吧!
  5. LeetCode(72)Edit Distance
  6. 2022-2028年中国汽车样车试制行业市场调研分析及发展规模预测报告
  7. 蓝桥杯:P0604 Runaround数
  8. WP采集插件教程不用谢规则的Wordpress采集
  9. developer工具oracle导出,[转]PL/SQLDeveloper导入导出Oracle数据库方法
  10. 【斐波那契数列及螺线 基于C语言】