BroadcastReceiver和EventBus区别是什么?他俩都挺像的,何时用BroadcastReceiver,何时用EventBus呢?android
Android广播分为两个方面:广播发送者和广播接收者,一般状况下,BroadcastReceiver指的就是广播接收者(广播接收器)。app
EventBus是一个发布 / 订阅的事件总线。简单点说,就是两人约定好怎么通讯,一人发布消息,另一个约定好的人立马接收到你发的消息。框架
用处:相信你们都用过Handle了进行线程通讯,回调方法进行通讯。EventBus就能够帮减小不少事,无论你在任何地方任何位置发布一个事件,接收者都能立马接收到你的消息,不用你考虑android子线程操做UI线程的问题。异步
1、广播做为Android组件间的通讯方式,可使用的场景以下:post
一、同一app内部的同一组件内的消息通讯(单个或多个线程之间);this
二、同一app内部的不一样组件之间的消息通讯(单个进程);线程
三、同一app具备多个进程的不一样组件之间的消息通讯;接口
四、不一样app之间的组件之间消息通讯;队列
五、Android系统在特定状况下与App之间的消息通讯。进程
2、以上列举的广播机制具体可使用的场景中,在实际应用中的适用性:
一、同一app内部的同一组件内的消息通讯(单个或多个线程之间),实际应用中确定是不会用到广播机制的(虽然能够用),不管是使用扩展变量做用域、基于接口的回调仍是Handler-post/Handler-Message等方式,均可以直接处理此类问题,若适用广播机制,显然有些“杀鸡牛刀”的感受;
二、同一app内部的不一样组件之间的消息通讯(单个进程),对于此类需求,在有些教复杂的状况下单纯的依靠基于接口的回调等方式很差处理,此时能够直接使用EventBus等,相对而言,EventBus因为是针对统一进程,用于处理此类需求很是适合,且轻松解耦。
三、其余情形,因为涉及不一样进程间的消息通讯,此时根据实际业务使用广播机制会显得很是适宜。
3、BroadcastReceiver的具体实现流程以下:
一、广播接收者BroadcastReceiver经过Binder机制向AMS(Activity Manager Service)进行注册;
二、广播发送者经过binder机制向AMS发送广播;
三、AMS查找符合相应条件(IntentFilter/Permission等)的BroadcastReceiver,将广播发送到BroadcastReceiver(通常状况下是Activity)相应的消息循环队列中;
四、消息循环执行拿到此广播,回调BroadcastReceiver中的onReceive()方法。
4、使用EventBus框架具体流程以下:
一、初始化时注册EventBus.getDefault().register(this);
二、用完以后注销EventBus.getDefault().unregister(this);
三、中间过程主要就是消息推送和接收了,经过EventBus.getDefault().post(param)推送,经过onEventMainThread(param),onEventPostThread(param),onEventBackgroundThread(param),onEventAsync(param)接收并处理。
由此看来,广播发送者和广播接收者分别属于观察者模式中的消息发布和订阅两端,AMS属于中间的处理中心。广播发送者和广播接收者的执行是异步的,发出去的广播不会关心有无接收者接收,也不肯定接收者究竟是什么时候才能接收到。显然,总体流程与EventBus很是相似。