美文网首页Android知识Android开发
Android广播:全局大喇叭是如何使用的!

Android广播:全局大喇叭是如何使用的!

作者: 威哥爱编程 | 来源:发表于2016-09-21 08:41 被阅读290次

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

    【正文】

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

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

    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.耗时的较长的工作最好放在服务中完成。


    相关文章

      网友评论

        本文标题:Android广播:全局大喇叭是如何使用的!

        本文链接:https://www.haomeiwen.com/subject/aslnettx.html