对于广播消息的处理,大致要经过消息发送、BroadcastReceiver注册和消息处理三个环节。
一.消息发送
消息发送有三种方式:
a.sendBroadcast()
b.sendStickyBroadcast()
sendStickyBroadcast()方法主要的不同是,Intent在发送后一直存在,并且在以后调用registerReceiver()注册相匹配的BroadcastReceiver时会把这个Intent直接返回。
注意要添加权限:<uses-permission android:name="android.permission.BROADCAST_STICKY"/>
c.sendOrderBroadcast()
使用sendBroadcast()或sendOrderBroadcast()方法发出去的Intent,所有满足条件的BroadcastReceiver都会随机地执行其onReceive()方法,而sendOrderBroadcast()发出去的Intent,会根据BroadcastReceiver注册时Intent Filter设置的优先级的顺序从高到低先后执行,相同优先级的BroadcastReceiver则是随机执行。在消息处理执行过程中,前面执行的BroadcastReceiver可以根据业务逻辑放弃消息处理,则后面的BroadcastReceiver将不再执行。
对于有序广播,前面的接受者可以将数据通过setResultExtras(Bundle)方法存放结果对象,然后传给下一个接受者,下一个接受者通过代码getResultExtras(true)可以获取上一个接受者存入在结果对象中的数据。使用abortBroadcast()可以停止广播的传播。
二.注册BroadcastReceiver
注册BroadcastReceiver有两种方式:
a.静态注册。在AndroidManifest.xml中用<receiver>标签声明,并在标签内用<intent-filter>标签设置过滤器。
b.动态注册。在代码中使用registerReceiver(BroadcastReceiver,IntentFilter)方法。取消注册则使用unregisterReceiver(BroadcastReceiver)。
要注意此时如果用动态注册BroadcastReceiver的Context对象被销毁时,BroadcastReceiver也就自动取消注册了。
根据Activity组件的生命周期,通常在onResume中注册BroadcastReceiver,在onPause中取消注册,这样可以大大降低系统的负担。
三.消息处理
若在使用sendBroadcast()的方法时指定了接收权限,则只有在AndroidManifest.xml中用标签<uses-permission>声明了拥有此权限的BroadcastReceiver才会有可能接收到发送过来的Intent。
同样,若在注册BroadcastReceiver时指定了接收权限,则只有在包内的AndroidManifest.xml中用标签<uses-permission>进行声明,拥有此权限的Context对象所发送的Broadcast才能被这个BroadcastReceiver所接收。
一个BroadcastReceiver可以处理多个广播消息,具体做法为在onReceive方法调用Intent参数的getAction()判断传进来的动作,即可进行不同的处理。
BroadcastReceiver对消息的处理是一种异步方式,发出消息的组件并不需要等待BroadcastReceiver处理完毕才执行其他动作。一旦BroadcastReceiver执行完onReceiver方法,BroadcastReceiver就有可能被Android系统回收。