一、广播机制的基本概念

当某个事件产生时(如一条短信发来或一个电话打来),android操作系统会把这个事件广播给所有注册的广播接收者,需要处理这个事件的广播接收者进行处理。其实这就是日常生活中的广播。发生一个新闻后,广播电台会广播这个新闻给打开收音机的人,对这个新闻感兴趣的人会关注,可能会拿笔记下。新闻就是事件,广播电台就是android系统,打开收音机的人就是广播接收者,感兴趣的人就是需要处理该事件的广播接收者,拿笔记下就是对该事件进行的操作。

二、广播的分类——普通广播和有序广播

①普通广播:完全异步,逻辑上可以被任何广播接收者接收到。优点是效率较高。缺点是一个接收者不能将处理结果传递给下一个接收者,并无法终止广播intent的传播。

②有序广播:按照被接收者的优先级顺序,在被接收者中一次传播。比如有三个广播接收者A,B,C,优先级是A > B > C。那这个消息先传给A,再传给B,最后传给C。每个接收者有权中终止广播,比如B终止广播,C就无法接收到。此外A接收到广播后可以对结果对象进行操作,当广播传给B时,B可以从结果对象中取得A存入的数据。如系统收到短信发出的广播就是有序广播。

三、注册广播接收者的两种方式

①在AndroidManifest.xml中注册

在配置文件中注册的接收者的特点是即使应用程序已被关闭,该接收者依然可接受它感兴趣的广播,比如手机电池电量的广播接收者,没有必要将某个程序开启。下面的例子1、2广播接收者会接收到拨打电话的广播。

    <application android:icon="@drawable/icon" android:label="@string/app_name">        <activity android:name=".MainActivity"                  android:label="@string/app_name">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>                 <!-- 广播接收者1-->  <receiver android:name=".BroadcastReceiver1">   <intent-filter>    <action android:name="android.intent.action.CALL"></action>   </intent-filter>  </receiver>    <!-- 广播接收者2 -->  <receiver android:name=".BroadcastReceiver2">   <intent-filter>    <action android:name="android.intent.action.CALL"></action>   </intent-filter>  </receiver>    <!-- 广播接收者3 -->  <receiver android:name=".BroadcastReceiver3">   <intent-filter>    <action android:name="android.intent.action.PICK"></action>   </intent-filter>  </receiver>      </application>
/** * 模拟拨打电话广播 *  * @author 徐越 *  */public class MainActivity extends Activity{ @Override public void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.main);  Intent intent = new Intent();  intent.setAction("android.intent.action.CALL");  this.sendBroadcast(intent); }}/** * 每次接收广播都会生成新的BroadcastReceiver1,当处理完onReceive方法后就不会再被使用 * 再次接收就在生成新的BroadcastReceiver1对象 *  * @author 徐越 *  */public class BroadcastReceiver1 extends android.content.BroadcastReceiver{ public BroadcastReceiver1() {  Log.i("xy_Receiver", "construtor1"); } @Override public void onReceive(Context context, Intent intent) {  Log.i("xy_Receiver", "onReceive1"); }}/** * 广播接收者2 *  * @author 徐越 *  */public class BroadcastReceiver2 extends android.content.BroadcastReceiver{ public BroadcastReceiver2() {  Log.i("xy_Receiver", "construtor2"); } @Override public void onReceive(Context context, Intent intent) {  Log.i("xy_Receiver", "onReceive2"); }}/** * 广播接收者3 *  * @author 徐越 *  */public class BroadcastReceiver3 extends android.content.BroadcastReceiver{ public BroadcastReceiver3() {  Log.i("xy_Receiver", "construtor3"); } @Override public void onReceive(Context context, Intent intent) {  Log.i("xy_Receiver", "onReceive3"); }}

②在Activity中注册

在Activity中绑定接收者必须依附该应用程序存在,或者一个BroadcastReceiver用于更新UI,就没有必要再程序关闭时接收者还运行,故无需在AndroidManifest.xml中注册而可以放在Activity中注册。

/** * Activity中注册广播接收者 *  * @author 徐越 *  */public class MainActivity extends Activity{ private BroadcastReceiver receiver; private static final String CALL_ACTION = "android.intent.action.CALL"; @Override public void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.main); } /**  * 模拟发送一个电话的广播  *   * @param v  */ public void sendBroadCast(View v) {  Intent intent = new Intent();  intent.setAction("android.intent.action.CALL");  this.sendBroadcast(intent); } public void bindReceiver(View v) {  receiver = new BroadcastReceiver();  IntentFilter intentFilter = new IntentFilter();  intentFilter.addAction(CALL_ACTION);  this.registerReceiver(receiver, intentFilter); } public void unBindReceiver(View v) {  this.unregisterReceiver(receiver); }}public class BroadcastReceiver extends android.content.BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) {  Log.i("xy", "receiver"); }}

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

Android开发22——广播接收者BroadcastReceiver的原理和注册方式相关推荐

  1. 广播接收者BroadcastReceiver

    Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器).广播作为Android组件间的通信方 ...

  2. Android开发中怎样调用系统Email发送邮件(多种调用方式)

    在Android中调用其他程序进行相关处理,几乎都是使用的Intent,所以,Email也不例外,所谓的调用Email,只是说Email可以接收Intent并做这些事情 我们都知道,在Android中 ...

  3. android中资源文件的两种访问方式,在android开发中进行数据存储与访问的多种方式介绍...

    在android开发中进行数据存储与访问的多种方式介绍 更新时间:2013年06月07日 16:24:23   作者: 很多时候我们的软件需要对处理后的数据进行存储或再次访问,Android为数据存储 ...

  4. Android中广播接收者BroadcastReceiver详解

    1. 接收系统的广播步骤 (1)  新建一个类继承BroadcastReceiver 以监听sd卡状态的广播接收者为例 1 public class SdCardBroadcastReceiver e ...

  5. Android复习12【广播接收者-BroadcastReceiver(简单案例-发送广播、静态注册、动态注册、本地广播、代码示例(别处登陆踢用户下线)、常用系统广播总结、音乐播放器)】

    2020-04-28[11周-周二] 音乐播放器Android代码下载:https://wws.lanzous.com/ifqzihaxvij 目   录 简单案例-发送广播 2)动态注册实例(监听网 ...

  6. Android开发之广播

    广播是Android开发中的一个重要的功能,在Android里面有各式各样的广播,比如:电池的状态变化.信号的强弱状态.电话的接听和短信的接收等等,现在给大家简单介绍一下系统发送.监听这些广播的机制. ...

  7. 在Android开发中,有哪些好的内存优化方式?如何避免 Out Of Memory(OOM) ?

    在Android中,一个Process 只能使用16M内存,要是超过了这个限定就会跳出这个异常.  那么,开发中,有哪些措施能避免这个问题呢?不仅仅是Bitmap的处理,其他方面也会导致OOM.有哪些 ...

  8. Android开发学习—指纹识别系统的原理与使用

    指纹识别是什么? 提到指纹识别我们就要先弄清楚什么事指纹,指纹为何能够做到区别性. 指纹,由于其具有终身不变性.唯一性和方便性,已几乎成为生物特征识别的代名词.指纹是指人的手指末端正面皮肤上凸凹不平产 ...

  9. Android开发如何高效学习系统底层原理

    本文首发于微信公众号「刘望舒」 大家好,我是刘望舒,I'm back!最近分享了一些视频,都属于望舒杂谈,望舒杂谈会分享一些经验,什么都会聊.除了望舒杂谈还有另一个视频分支叫做BATcoder,什么是 ...

  10. Android面试,BroadCastReceiver的两种注册方式的异同

    在Android手机应用程序中开发中,需要用到BroadcastReceiver来监听广播的消息.在自定义好BroadcastReceiver ,需要对其进行注册,注册有两种方法: 一种是在代码当中注 ...

最新文章

  1. tf.where() 详解
  2. 科普:目标检测Anchor是什么?怎么科学设置?[附代码]
  3. 关于function和Object的认识
  4. Nginx的几个常用配置和技巧
  5. install scrapy with pip and easy_install
  6. 二:unittest框架配合selenium之xpath定位
  7. 【数据库系统】文件处理系统和DBMS的主要区别
  8. 一半的一半(51Nod-2382)
  9. 计算机视觉论文-2021-06-28
  10. php 中文手册下载
  11. react native 更改app名称和图标
  12. Markdown - 如何给文本加下划线
  13. 华硕fl5600l笔记本拆机,在光驱位加装固态硬盘
  14. 如何在C#中将 加载、编辑WPS表格?国产控件就能搞定
  15. 5Gwifi和手机5G区别
  16. 《看聊天记录都学不会C语言?太菜了吧》(6)编程很难吗?差一点就学不会了呢!
  17. 介绍Jackson JsonNode和ObjectNode(*)
  18. 看了这篇,你也是Python文件操作高手
  19. 在Google Play发布应用显示设备数量为0,处理办法
  20. 手把手教您搞定用户画像(战略解读|建模体系|维度分解|应用流程)

热门文章

  1. R与Python手牵手:多格式文件导入与爬虫
  2. 学习数学到底有什么用?
  3. FTP协议的命令与返回码
  4. Qt之QSS(白色靓丽)
  5. 机器学习实战笔记(Python实现)-01-K近邻算法(KNN)
  6. 数码媒体前股东向华视传媒提告状讼
  7. 小程序对实体行业转型有何影响?
  8. Async和Await简介
  9. linux每日命令(20):find命令概览
  10. 【python】-- 队列(Queue)、生产者消费者模型