BroadcastReceiver是一种全局监听器,用来实现系统中不同组件之间的通信。有时候也会用来作为传输少量发送频率低的数据。
BroadcastReceiver实现机制
1.自定义广播类继承BroadcastReceiver,复写onReceiver()
2.通过Bnder机制向AndroidManifest进行注册广播
3.广播发送者通过Binder机制向AndroidManifest发送广播
4.AMS查找符合相应条件的广播发送到BroadcastReceiver相应的循环队列
5.消息队列执行拿到广播,回调BroadcastReceiver的onReceiver()
BroadcastReceiver的生命周期
1.动态注册:存活周期是在Context.registerReceiver和Context.unregisterReceiver之间,BroadcastReceiver每次收到广播都是使用注册传入的对象处理的。
2.静态注册:进程在的情况下,receiver会正常收到广播,调用onReceive方法,生命周期只存活在onReveive函数中,此方法结束,BroadcastReceiver就销毁了。进程不存在时,广播相应的进程会被激活,Application.onCreate会被调用,再调用onReceive()
广播的分类
1.普通广播:完全异步的,可以在同一时刻被所有接收者接收到,消息传递的效率比较高,并且无法中断广播的传播
2.有序广播:发送有序广播后,广播接收者将按预先声明的优先级依次接收Broadcast.优先级高的先接收到广播,而在其onRecevier()执行过程中,广播不会传播到下一个接收者,此时当前的广播接收者可以abortBroadcast()来总之广播继续向下传播。sendOrderedBroadcast(intent,null)发送有序广播
3.粘性广播:sendStickyBroadcast()来发送该类型的广播消息,当粘性广播发送后,最后一个粘性广播会滞留在操作系统中,在粘性广播发送后的一段时间里,如果有新的符合广播的动态注册广播接收者,将会收到这个广播消息。对于静态注册的广播接收者来说,这个等同于普通广播。
4.本地广播
广播使用的方式和场景
1.app全局监听:不同APP之间的组件之间的消息通信。在AndroidManifest中静态注册的广播接收器,一般我们在收到该消息后,需要做一些相应的动作,而这些动作与当前App的组件,比如Activity或者Service的是否运行无关。
2.组件局部监听:同一APP具有多个进程的不同组件之间的消息通信。这种主要是在Activity或者Service中使用registerReceiver()动态注册的广播接收器。比如网络连接发生变化时,需要在当前Activity页面给用户一些UI 上的提示,或者将Service中的网络请求任务暂停。动态注册的广播接收器适合特定组件的特定消息处理。
本地广播和全局广播差别
1.LocalBroadcastReveiver仅在自己的应用内发送接受广播,数据更加安全。只能动态注册,在发送和注册时采用sendBroadcast和registerReceiver方法
2.全局广播:发送的广播事件可被其他应用程序获取,也能响应其他应用程序发送的广播事件。全局广播既可动态注册也可以静态注册