博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android广播:全局大喇叭是如何使用的!
阅读量:6607 次
发布时间:2019-06-24

本文共 1904 字,大约阅读时间需要 6 分钟。

hot3.png

【威哥说】Android界面间传输数据方式有很多,除了传统的接口回调、构造等方式,Google系统给我们内置了一种叫做广播的机制,如同名字,也就是全局的发送,使用intent可以携带各种数据。那么它的原理是什么?那些细节需要我们注意?下面,我们一起来看Android 广播的使用。

【正文】 BroadcastReceiver,是一个广播接收者,因为android组件之间消息的传递基于intent,所以广播接收者想要接收什么类型的广播,将receiver标签下的intent-filter标签下的action标签的值置为那个广播类型即可。

<receiver android:name=".MySMSReceiver"> <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED"/> </intent-filter> </receiver>

除了清单文件中以外,也可以直接在代码中订阅:

IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); Receiver receiver = new Receiver(); registerReceiver(receiver, filter);

Receiver是你自己写的继承自BroadcastReceiver的类。IntentFilter就对应着Action,这里看到filter和上面清单文件中的一样。还有一个细节是sendBroadcast的三种发送方法。

sendBroadcast(), sendOrderedBroadcast() sendStickyBroadcast()

sendBroadcast()这个方法的广播是能够发送给所有广播接收者,按照注册的先后顺序,如果你这个时候设置了广播接收者的优先级,优先级如果恰好与注册顺序相同,则不会有任何问题,如果顺序不一样,会出leaked IntentReceiver 这样的异常,并且在前面的广播接收者不能调用abortBroadcast()方法将其终止,如果调用会出BroadcastReceiver trying to return result during a non-ordered broadcast的异常,当然,先接收到广播的receiver可以修改广播数据。sendOrderedBroadcast()方法顾名思义就是priority的属性能起作用,并且在队列前面的receiver可以随时终止广播的发送。还有这个api能指定final的receiver,这个receiver是最后一个接收广播时间的receiver,并且一定会接收到广播事件,是不能被前面的receiver拦截的。实际做实验的情况是这样的,假设我有3个receiver依序排列,并且sendOrderedBroadcast()方法指定了一个finalReceiver,那么intent传递给这4个Receiver的顺序为Receiver1-->finalReceiver-->Receiver2-->finalReceiver-->Receiver3-->finalReceiver。这个特性可以用来统计系统中能监听某种广播的Receiver的数目。sendStickyBroadcast()字面意思是发送粘性的广播,使用这个api需要权限android.Manifest.permission.BROADCAST_STICKY,粘性广播的特点是Intent会一直保留到广播事件结束,而这种广播也没有所谓的10秒限制,10秒限制是指普通的广播如果onReceive方法执行时间太长,超过10秒的时候系统会将这个广播置为可以干掉的candidate,一旦系统资源不够的时候,就会干掉这个广播而让它不执行。下面是广播接收者的生命周期以及一些细节部分:1.广播接收者的生命周期是非常短暂的,在接收到广播的时候创建,onReceive()方法结束之后销毁;2.广播接收者中不要做一些耗时的工作,否则会弹出Application No Response错误对话框;3.最好也不要在广播接收者中创建子线程做耗时的工作,因为广播接收者被销毁后进程就成为了空进程,很容易被系统杀掉;4.耗时的较长的工作最好放在服务中完成。

输入图片说明

转载于:https://my.oschina.net/moliying/blog/749565

你可能感兴趣的文章
Ubuntu+Apache+PHP+Mysql环境搭建(完整版)
查看>>
Atitit.计算机图形图像图片处理原理与概论attilax总结
查看>>
于ssh端口转发的深入实例[转 - 当当 - 51CTO技术博客
查看>>
从Python安装到语法基础,这才是初学者都能懂的爬虫教程 ...
查看>>
超级AD远程管理软件
查看>>
Oracle数据库安全加固记录
查看>>
ubuntu12.04 “flash 设置” 无法点击
查看>>
Exchange Server 2013预览版服务器角色概况
查看>>
安全运维之:Linux系统账户和登录安全
查看>>
SQL PASS西雅图之行——Lake Union纪行
查看>>
【cocos2d-x从c++到js】17:使用FireFox进行JS远程调试
查看>>
shtml用include加载文件,apache开启SSI,及shtml压缩
查看>>
oc53--autorelease注意事项
查看>>
对于Python中RawString的理解
查看>>
Kafka Offset Storage
查看>>
Windows Mobile下访问Sqlite的Native C++封装
查看>>
一个优秀的Unity3d开发者必备的几种设计模式
查看>>
深度学习笔记之CNN(卷积神经网络)基础
查看>>
表单提交的3种方式,http post的contentType
查看>>
在VirtualBox里复制VDI文件[转]
查看>>