一、什么是广播
在Android系统中,广播(Broadcast)是在组件之间传播数据(Intent)的一种机制;这些组件甚至是可以位于不同的进程中,这样它就像Binder机制一样,起到进程间通信的作用;与intent不同的是,广播消息可以被多个brocaseRecever来处理,换句话来讲,intnet是一种一对一的通信 ,广播消息是一种一对多的通信。
二、广播的类型
(1)无序广播,通过Context.sendBroadcast()发送消息。
(2)有序广播,通过Context.sendOrderBroadcast()发送消息。前面的接受者可以将数据通过setResultExtras(bundle)方法,然后传递给下一个接收者,接收方法Bundle bundle= getResultExtras(true)来获取。
(3)持续广播,通过Context.sendStickyBroadcast()发送消息。被发送的广播消息一直存在。
三、广播消息的处理流程
广播消息的实质就是一个Intent对象,要发送一个广播消息, 首先要把要发送的消息和相关的属性信息如action,category等封装进一个intent对象中,然后调用Context.sendBroadcase()方法,
使用sendBroadcase和sendStickyBroadcast方法发出去的intent,所有满足条件broadcaseReceiver 都会随机地执行其OnReceiver方法;而sendOrderBroadcast()发出去的Intent,会根据BroadcastReceiver注册时Intent Filter 设置的优先级的顺序来执行,相同优先级的BroadcastReceiver则是随机执行。sendStickyBroadcast方法主要的不同是,Intent在发送后一直存在,并且在以后调用的registerReceiver注册相匹配的BroadcastReceiver时会把这个intent直接返回。
四、注册BroadcastReceiver
BroadCaseReceiver作为四大应用组件之一,必须经过注册才能处理广播消息。注册BroadcaseReceiver有二种方式。
一种静态注册。在AndroidManifest.xml中用<receiver>标签声明,并在标签内用<intent-filter>标签设置过滤器。
另一种是动态注册。调用Context.registerReceiver(BroadcastReceive,intentFilter)来执行,如果是取消就调用Context.unregisterReceiver(BroadcastReceiver)。注意的是,如果是动态注册的,Context对象被销毁时,BroadcastReceiver也就自动取消注册了。
五、处理消息
一个BroadcaseReceiver可以处理多个广播消息,在onReceiver方法中根据intent的getAction方法来判断传进来的动作。
BroadcaseReceiver对消息的处理是异步的,发出消息的组件并不需要等待BroadcaseReceiver处理完毕后才执行其它动作,一旦BroadcastReceiver执行完毕OnReceive方法,BroadcastReceiver的实例就会被销毁或被被android系统回收。还有时间限制,如果10秒内没有执行完毕,android系统就会认为该程序无响应,所以不能执行比较耗时的操作。
特别注意的是,在OnReceiver方法里也不能使用子线程来解决,应为Broadcast的生命周期很短,子线程可能还没有结束BroadcastReceiver就先结束了。而BroadcastReceiver一旦先结束,它所在的进程很容易在系统需要内存是被优先杀死,应为它属性空进程,那么正在工作的子线程也会被杀死,所以不能采用子线程不可靠。所以解决的办法是通过发送Intent给service,有service来完成。
六、广播的优先级
动态注册的优先级高于静态注册的,同样是动态注册的,优点级别高的将先被触发,同样是静态注册的,在<receiver>中的intent-filter设置android:priority属性区分其优先级别。