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

  • 效率,其底层使用了共享内存机制,提高了数据读写的效率
  • 安全,从底层着手控制每个进程之间的访问权限,相比Linux在上层来控制访问权限要更加安全

在Android中对binder的使用方式:

  • 1.代理模式,每个Client在访问Service之前都会获取一个Service的代理,然后通过这个代理来调用Service端提供的功能。比方说我们在Activity或者Service中通过
  • 2.采用广播发送/接收的形式,也就是Broadcast和BroadcastReceiver,这种方式本质上属于消息订阅/发布的事件驱动流形式。

代理模式和广播的区别:

两者的区别,体现在同步调用和异步调用上。

  • 代理模式用于点对点通信,即网络通信中的单播模式,效率自然是高。但是该通信方式是即时发起的,只能同步调用
  • 广播虽然效率低一些,但是发送、接收双方无需知道对方是否存在,可以随时发起,且可供异步调用,由此带来的高度可扩展性,简直不要太爽

Android“大神”—罗升阳对广播的表述可谓鞭辟入里:

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

在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. mysql表分区占用存储_MySQL 分区分表应用场景分析和分区中可能遇到的坑点

    MySQL的分区和分表应用场景分析 在日常工作中当我们的某张表的数据量过大的时候,首当其冲的可能就是进行分区和分表,但是是如何分区或者分表都要结合一点的业务场景下进行分析,才会显著的提升性能,来聊一聊 ...

  2. 如何调整按钮里的文字的位置android_UI设计中按钮场景分析

    别无他话,今天就和大家聊一聊设计宿敌--按钮设计.按钮的设计看似简单,其实按钮的功能不同,设计形式上也会有差异,今天我就针对按钮的场景分析,对按钮进行全面的解析. 按照功能性分类,按钮主要包括行为召唤 ...

  3. 电商抢购秒杀系统的设计_1_应用场景分析

    2019独角兽企业重金招聘Python工程师标准>>> 电商抢购秒杀系统的设计_1_应用场景分析 概述 所谓知已知彼,百战不殆,在开始详细介绍实战中的抢购秒杀系统时,我们了解一些抢购 ...

  4. spring bean scope作用域及多线程安全问题场景分析

    2019独角兽企业重金招聘Python工程师标准>>> Scope作用域 在 Spring IoC 容器中具有以下几种作用域: singleton:单例模式,在整个Spring Io ...

  5. mysql 事务 查询 范围加锁_MySQL死锁系列-常见加锁场景分析

    本文我们就从原理走向实战,分析常见 SQL 语句的加锁场景.了解了这几种场景,相信小伙伴们也能举一反三,灵活地分析真实开发过程中遇到的加锁问题. 如下图所示,数据库的隔离等级,SQL 语句和当前数据库 ...

  6. mysql常见死锁_MySQL死锁系列-常见加锁场景分析

    如下图所示,数据库的隔离等级,SQL 语句和当前数据库数据会共同影响该条 SQL 执行时数据库生成的锁模式,锁类型和锁数量. 下面,我们会首先讲解一下隔离等级.不同 SQL 语句 和 当前数据库数据对 ...

  7. 高并发编程-Daemon Thread的创建以及使用场景分析

    文章目录 官方文档 Daemon Thread VS User Thread Daemon thread的特点 方法 void setDaemon(boolean status) boolean is ...

  8. Ansible自动化运维企业实际应用场景分析

    企业实际应用场景分析 Dev开发环境 使用者:程序员 ​ 功能:程序员个人的办公电脑或项目的开发测试环境,部署开发软件,测试个人或项目整体的BUG的环境 ​ 管理者:程序员 测试环境 使用者:QA测试 ...

  9. shiro的会话管理:应用场景分析

    应用场景分析 在分布式系统或者微服务架构下,都是通过统一的认证中心进行用户认证.如果使用默认会话管理,用户信息只会保存到一台服务器上.那么其他服务就需要进行会话的同步. 会话管理器可以指定sessio ...

最新文章

  1. 网络IO模型的深入浅出
  2. java集群_JAVA架构师学习:实践ZooKeeper 应用场景与集群管理,辛勤总结
  3. 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-PLC支持哪些PLC语言类型
  4. 想在边缘运行计算机视觉程序?先来迎接挑战!
  5. 这么做科研你也能成功!
  6. 利用反射获取类或者方法或者字段上的注解的值
  7. 阿里大牛总结:学会这些Kafka知识,吊打面试官就是分分钟的事
  8. 31. Element previousSibling 属性
  9. [答疑]纪检监察部门的业务用例图
  10. Python将图片转换成二进制的.txt文件
  11. 【Unity】unity3d客户端网络框架
  12. 天龙3d服务器维护,天龙八部3D4月6日维护服务器公告
  13. 前端代理解决跨域问题
  14. HTTP上传数据 :表单,二进制数据(multipart/form-data application/octet-stream boundary)...
  15. 使用mclust进行聚类分析
  16. UBT14:ubuntu安装Drawing
  17. 绝对零度试验机的创造战记:2.小型HTML5本地音乐播放器
  18. Ubuntu 13.04 小米2S连接Eclipse真机调试
  19. ​DMBOK知识梳理for CDGA/CDGP——第六章 数据存储与操作(附常考知识点)
  20. 2018_10_17 模拟赛

热门文章

  1. c++ 包络谱分析代码_基于特征分析谱估计算法(Capon, MUSIC, ESPRIT)的C++实现
  2. docker 镜像修改的配置文件自动还原_原创 | 全网最实在的docker入门教程四
  3. location [=|$|最长原则|^~](nginx-1.4.4)
  4. 一个虚拟键盘的简单思路
  5. 在Linux系统下查看ora错误
  6. Shell之sed用法 转滴
  7. C#中Socket多线程编程实例
  8. 调用加了SSL签名的WebService
  9. 第一次现场看球,第一次场看国家队打球,第一次场看国家队打架,第一次上电视,第... ......
  10. vue填坑指南之模板的使用