在之前的一篇文章《基于场景解读Android四大组件》谈到BroadcastReceiver是Android提供给开发者的一个组件,主要用来完成前台和后台之前的通信,也就是Activity和Service之间的通信。今天我们继续通过使用场景来分析Android中的Broadcaster和BroadcastReceiver。

我们知道Android的底层使用了Linux内核,Linux下面提供了很多的IPC通信方式,比如消息,管道,共享内存,信号量,Socket等等。但是Android并没有采用Linux的几种IPC方案,而是使用了binder来完成进程之间的IPC。这主要是基于以下两点考虑:

  • 效率,其底层使用了共享内存机制,提高了数据读写的效率
  • 安全,从底层着手控制每个进程之间的访问权限,相比Linux在上层来控制访问权限要更加安全
那么binder又是如何在Android中使用的呢?主要有两种方式:
  • 采用代理模式,每个Client在访问Service之前都会获取一个Service的代理,然后通过这个代理来调用Service端提供的功能。比方说我们在Activity或者Service中通过getSystemService()获取到的XXXManager接口就属于这种。
  • 采用广播发送/接收的形式,也就是我们今天要讲的Broadcast和BroadcastReceiver,这种方式本质上属于消息订阅/发布的事件驱动流形式。
那么这两种形式有什么区别呢?
  • 代理模式一般用于点对点通信,也就是网络通信中的单播模式,优点是效率高,缺点是通信是即时发起的,同步调用。
  • 广播方式的话,效率相对低一些,但是通信是随时发起,异步调用。

这里引用老罗一篇博客《Android系统中的广播(Broadcast)机制》里面的描述会更清晰:

在Android系统中,为什么需要广播机制呢?广播机制,本质上它就是一种组件间的通信方式,如果是两个组件位于不同的进程当中,那么可以用Binder机制来实现,如果两个组件是在同一个进程中,那么它们之间可以用来通信的方式就更多了,这样看来,广播机制似乎是多余的。然而,广播机制却是不可替代的,它和Binder机制不一样的地方在于,广播的发送者和接收者事先是不需要知道对方的存在的,这样带来的好处便是,系统的各个组件可以松耦合地组织在一起,这样系统就具有高度的可扩展性,容易与其它系统进行集成。
在软件工程中,是非常强调模块之间的高内聚低耦合性的,不然的话,随着系统越来越庞大,就会面临着越来越难维护的风险,最后导致整个项目的失败。Android应用程序的组织方式,可以说是把这种高内聚低耦合性的思想贯彻得非常透彻,在任何一个Activity中,都可以使用一个简单的Intent,通过startActivity或者startService,就可以把另外一个Activity或者Service启动起来为它服务,而且它根本上不依赖这个Activity或者Service的实现,只需要知道它的字符串形式的名字即可,而广播机制更绝,它连接收者的名字都不需要知道。

关于Android Broadcast的使用这里不做介绍,我们这里只谈谈Broadcast的使用场景。目前在App开发中的消息全局通知方案有以下几种:系统广播,观察者和eventbus等第三方开源工具。观察者和eventbus都只能用于应用内的消息通信,他们之间的区别主要在于实现方式的不同。观察者是由用户通过handler自己实现一套,维护和扩展方便,但是一般不支持优先级和sticky等原生广播特性,而且随着业务逻辑复杂度增加,监听接口会迅速膨胀。eventbus等第三方开源工具功能使用简单,功能也要强大一些,支持优先级和sticky等原生广播特性。但是由于是使用第三方库所以在不了解其实现原理的情况下bug调试跟踪会变得困难,而且更新库(接口或者一些属性有变动的话)可能会影响到代码的大面积改动。broadcast不仅支持应用内通信也支持不同应用进程之间的通信。但是由于其底层使用binder来实现,所以效率上与前两者相比要低一些。当然broadcast最大的优势还是在对系统事件的监听上,这是其他两个方案没法办到的。所以关于消息通信方案的选择上,需要根据自己的需求来选择合适的方案。当需要App应用内通信时,优先选择观察者或者Eventbus,当需要进程间通信或者监听系统广播事件时,选择Broadcast。另外再提一下LocalBroadcastManager这个类,它是一个本地广播管理器,估计是Android考虑到原生Broadcast的效率问题而提供的一个轻量级的广播。它主要是解决App应用内通信的问题,采用handler实现,跟观察者的实现方案类似,有兴趣的可以去看下它的源码。

Android提供了BroadcastReceiver这个组件来帮助我们监听广播消息,这里我们来看下BroadcastReceiver的使用场景:
  • App全局监听,这种主要用于在AndroidManifest中静态注册的广播接收器,一般我们在收到该消息后,需要做一些相应的动作,而这些动作与当前App的组件,比如Activity或者Service的是否运行无关,比如我们在集成第三方Push SDK时,一般都会添加一个静态注册的BroadcastReceiver来监听Push消息,当有Push消息过来时,会在后台做一些网络请求或者发送通知等等。
  • 组件局部监听,这种主要是在Activity或者Service中使用registerReceiver()动态注册的广播接收器,因为当我们收到一些特定的消息,比如网络连接发生变化时,我们可能需要在当前Activity页面给用户一些UI上的提示,或者将Service中的网络请求任务暂停。所以这种动态注册的广播接收器适合特定组件的特定消息处理。
关于BroadcastReceiver使用需要注意的几点:
  • onReceive中不能执行耗时操作,如果耗时超过10s会弹出ANR。
  • onReceive中context参数,如果是静态注册的广播,context为ReceiverRestrictedContext,所在如果在这里要启动一个Activity的话(调用startActivity),需要在intent中添加Intent.FLAG_ACTIVITY_NEW_TASK;如果是动态注册的广播,context为当前注册时所在的组件,比如Activity或者Service。
  • 监听系统广播,需要在AndroidManifest中申请权限,此外,Android高版本系统对于一些重要的系统广播,比如开机启动,网络连接,电量变化,锁屏等做了限制,如果需要监听这些广播,需要做系统兼容性处理。
  • 普通广播的广播接收器是并行无序执行的,有序广播的广播接收器按照广播优先级串行执行。

Broadcast使用场景解读相关推荐

  1. Kubernetes 弹性伸缩全场景解读(五) - 定时伸缩组件发布与开源

    作者| 阿里云容器技术专家刘中巍(莫源) 导读:Kubernetes弹性伸缩系列文章为读者一一解析了各个弹性伸缩组件的相关原理和用法.本篇文章中,阿里云容器技术专家莫源将为你带来定时伸缩组件  kub ...

  2. Broadcast应用场景分析

    Android基于Linux内核,Linux提供了诸如消息.管道.共享内存.信号量.Socket等多种通信方式.然而Android采用了binder实现进程间通信,而未理睬Linux提供的通信方式,主 ...

  3. 海量结构化数据解决方案-表格存储场景解读

    简介: 数据是驱动业务创新的最核心的资产.不同类型的数据如非结构化数据(视频.图片等).结构化数据(订单.轨迹),面向不同业务的使用要求需要选择适合的存储引擎,能够真正发挥数据的价值.针对于海量的非强 ...

  4. 构建全渠道零售平台及营销场景解读

    阅读原文 1.中国"新零售"发展趋势与机遇 根据阿里研究院与BCG合作的<中国消费新趋势>研究报告显示,在未来5年, "新零售"将激活总共六万亿美元 ...

  5. Kubernetes 弹性伸缩全场景解读(二)- HPA 的原理与演进

    前言 在上一篇文章 Kubernetes 弹性伸缩全场景解析 (一):概念延伸与组件布局中,我们介绍了在 Kubernetes 在处理弹性伸缩时的设计理念以及相关组件的布局,在今天这篇文章中,会为大家 ...

  6. PPT 下载 | 神策数据孙超赟:多场景解读运营的价值、生存状态与解决方案

    本文为神策数据业务咨询师孙超赟在<深挖用户存量价值,释放运营想象力>主题沙龙中分享的<神策智能运营案例分享>的主题演讲整理所得. 温馨提示:点击阅读原文,可下载完整版演讲 PP ...

  7. 实时计算 Flink 版应用场景解读

    简介:本文由阿里巴巴高级产品专家陈守元老师分享,详细讲解实时计算 Flink 的具体业务场景并分享实时计算 Flink 的相关应用案例. 作者:陈守元(巴真),阿里巴巴高级产品专家 摘要:本文由阿里巴 ...

  8. Kubernetes弹性伸缩全场景解读(五) - 定时伸缩组件发布与开源

    前言 容器技术的发展让软件交付和运维变得更加标准化.轻量化.自动化.这使得动态调整负载的容量变成一件非常简单的事情.在kubernetes中,通常只需要修改对应的replicas数目即可完成.当负载的 ...

  9. 蓝牙室内定位技术系统应用场景解读

    现代制造业厂区面积大.人员数量多.物资设备不断增加,随着工业信息化技术的发展,大型制造企业中对人员.车辆.物资的管理要求越来越细致.传统的制造业工厂普遍存在人员位置不可知.人员监管系统效率低.无可视化 ...

最新文章

  1. 植物大战僵尸食人花无cd逆向分析
  2. Linux shell ==运算符
  3. win10进程太多怎么优化_【电脑维护宝典】WIN10系统下的电脑维护(2)
  4. 华为交换机ssh思科交换机_华为交换机 ssh 配置(极简版)
  5. [转]IT开发工程师的悲哀
  6. AI手机会怎么样?那不得看高通骁龙的AI能怎样
  7. c语言二维数组错误语法,关于c语言动态分配二维数组free的错误求dalao看看怎么回事谢谢啊~~~~...
  8. django 获取环境变量_django 环境变量配置过程详解
  9. jspstudy启动mysql失败_mysql启动失败的一个解决方法
  10. android自定义图标下载,Android使用IconFont矢量图标库
  11. js处理的8种跨域方法
  12. 23000字,讲清信息流广告数据分析。
  13. 【光电智造】机器人视觉伺服技术
  14. 计算机快捷键ctrl记忆,PS篇:有效记忆快捷键
  15. 50 行代码爬取链家租房信息
  16. 【虚幻引擎】实现类LOL缓慢扣血血条
  17. 红茶馆:承诺满天下,守信行万里
  18. 集体所有制的企业是属于国企吗
  19. Shared Project
  20. VC++实现双人对决的围棋程序,附源码

热门文章

  1. 信息化治理与北京治堵:疏图同归
  2. 纽曼欲借“机”上位,纽扣获YunOS力挺
  3. 7个免费的Windows数据恢复工具
  4. Qt基础之二十六:Qt绘图系统(Paint System)
  5. 田志刚:卓越绩效评价中的知识管理模块分析
  6. 吾爱破解crackme 065-070
  7. 常见电脑故障维修-硬盘篇
  8. 超详细!附源码!SpringBoot+shiro+mybatis+Thymeleaf实现权限登录系统
  9. python pyautogui_【Python 教程】PyAutoGUI 使用介绍
  10. 1 PyAutoGUI简介