安卓四大组件之Broadcast Receiver-广播接收者

1、描述广播接收者

BroadCastReceiver是安卓中四大组件之一,主要用于接收系统或者APP发送的广播事件。

广播两种:有序和无序

内部通信实现机制:通过安卓系统的Binder机制是实现通信。

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

有序广播:按照被接收者的优先级别,在被接收者中依次传播。比如有三个广播接受者ABC,优先级A>B>C,那么信息先传给A,然后B然后C,每个接受者有终止广播的去权利,而且中间的接受者可以对结果对象进行操作,当广播传递给B时,B可以从结果对象中取得A存入的说数据。

Context.sendOrderedBroadcast(intent,recerverPermission,resultReceiver,scheduler,initalCode,initialData,initalExtras)我们可以指定resultRecerver广播接收者,这个接收者我们可以认为是最终的接收者,通常情况下如果比他优先级更高的接收者如果没有终止广播,那么他的onRecerve会被执行两次,第一次是正常的按照优先顺序执行,的二次是作为最终接收者来执行。如果比他优先级高的广播接收者中断了广播,那么它一样可以接收到广播。

在我们的项目中经常使用广播接收者收系统的通知,比如开机启动,Sd卡挂载,低电量,外拨电话,锁屏等等、

如果我们做的是播放器,那么监听用户锁屏后我们应该将我们的播放暂停等等,总之用处还是挺广泛的。

2、在清单文件(manifest)和代码中如何注册和使用BroadcastReceiver?

在清单文件中注册广播接收者成为静态注册,在代码中注册则为动态注册。

静态注册的广播接受者只要APP在系统中运行,则一直可以接收到广播,动态注册的广播接受者当注册的Activity或者Service摧毁的时候那么就接收不到广播了。

静态注册:

<b><receiver android:name=".BroadcastReceiver1" >
<intent-filter>
<action android:name="android.intent.action.CALL" >
</action> 
</intent-filter>
</receiver></b>
动态注册:
receiver = new BroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(CALL_ACTION);
context.registerReceiver(receiver, intentFilter);

3、BroadCastReceiver的生命周期?

a.广播接收者生命周期短暂,在接收到广播的时候创建,onReceive方法结束后销毁

b.广播接收者中不要做耗时的操作,否则会弹出ANR错误对话框

c.最好也不要在广播接收者中创建子线程做耗时的工作,因为广播接受者摧毁后进程就成为了空进程,很容易被系统杀死

d.耗时的操作最好放在服务中进行

4、Android引入广播机制的用意?

a.从MVC的角度考虑,其实回答这个问题的时候还可以这样问,安卓为什么有四大组件,现在的移动开发模型基本上是照搬WEB开发的MVC构架,只不过是改了点嫁装而已。安卓的四大组件本质上就是为了实现移动或者说嵌入式设备上的MVC构架,它们会见有时候是一种相互依存的关系,有时候又是一宗相互补充的关系,引入广播机制可以方便几大组件信息和数据的交互。

b.程序间互通信息

c.效率上也比较高(参考UDP)

d.设计模式上(类似与监听者模式)

本文转自诡道网!由杨小杰blog进行排版整合。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏黑泽君的专栏

day24_Nginx学习笔记

     反向代理方式实际上就是一台负责转发的代理服务器,貌似充当了真正服务器的功能,但实际上并不是,代理服务器只是充当了转发的作用,并且从真正的服务器那里取得...

883
来自专栏大闲人柴毛毛

架构高性能网站秘笈(二)——动态内容缓存

什么是动态内容缓存? 浏览器向服务器发送请求后,服务器会根据浏览器的要求做相应的处理(如:数据库操作),然后将处理后的结果注入JSP页面生成HTML,最后将生...

3286
来自专栏运维咖啡吧

探秘varian:优雅的发布部署程序

varian是我们基于Python3编写的一套部署程序,处在整个部署系统的中心,与CMDB、Jenkins、SVN/Git、镜像仓库Harbor、Kuberne...

1097
来自专栏python学习之旅

loadrunner笔记(三):设置、运行场景和生成测试报告

1614
来自专栏顶级程序员

Git 12 岁了,为你送上 12 个 Git 的使用技巧!

源 / 开源中国 使用这12个Git的诀窍与技巧来令你的版本控制经验更加有用。 Git,一个分布式版本控制系统,它已经成为了开源世界的源码控制默认工具,在4月...

3995
来自专栏云计算

Kubernetes的服务网格(第4部分):通过流量切换持续部署

除了服务发现,重要指标和TLS之外,linkerd还具有强大的路由语言,称为dtabs,可以用来改变请求的方式 - 甚至是单个请求 - 流经应用程序拓扑。在本文...

4627
来自专栏java架构师

Hadoop学习13--zookeeper相关

zookeeper要保证各个server之间同步,实现同步的协议是zab协议。此协议有两种模式:恢复模式(选主)和广播模式(同步)。 服务启动或者leader崩...

3438
来自专栏Ksher

Kubernetes的服务网格(第4部分):通过流量切换持续部署

翻译人:Ksher,该成员来自云+社区翻译社

3938
来自专栏码神联盟

nginx+tomcat负载均衡配置

前几天,我们讲过了【互联网常见架构模式 之 nginx负载均衡】(忘记的童鞋,点击上面链接或者输入关键词:nginx\负载均衡,即可重新阅读),...

4528
来自专栏IMWeb前端团队

从零开始学web安全(1)

本文作者:IMWeb 刘志龙 原文出处:IMWeb社区 未经同意,禁止转载 一直对web安全很感兴趣,却一直只是略懂一点。决定从现在开始学起web安全...

1968

扫码关注云+社区

领取腾讯云代金券