【威哥说】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.耗时的较长的工作最好放在服务中完成。
网友评论