亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

BroadcastReceiver和EventBus區別是什么

BroadcastReceiver和EventBus區別是什么

拉丁的傳說 2018-06-26 10:18:20
BroadcastReceiver和EventBus區別是什么?他倆都挺像的,什么時候用BroadcastReceiver,什么時候用EventBus呢?
查看完整描述

1 回答

?
動漫人物

TA貢獻1815條經驗 獲得超10個贊

Android廣播分為兩個方面:廣播發送者和廣播接收者,通常情況下,BroadcastReceiver指的就是廣播接收者(廣播接收器)。

  EventBus是一個發布 / 訂閱的事件總線。簡單點說,就是兩人約定好怎么通信,一人發布消息,另外一個約定好的人立馬接收到你發的消息。

  用處:相信大家都用過Handle了進行線程通信,回調方法進行通信。EventBus就可以幫減少很多事,不管你在任何地方任何位置發布一個事件,接收者都能立馬接收到你的消息,不用你考慮android子線程操作UI線程的問題。

  一、廣播作為Android組件間的通信方式,可以使用的場景如下:

  1、同一app內部的同一組件內的消息通信(單個或多個線程之間);

  2、同一app內部的不同組件之間的消息通信(單個進程);

  3、同一app具有多個進程的不同組件之間的消息通信;

  4、不同app之間的組件之間消息通信;

  5、Android系統在特定情況下與App之間的消息通信。

  二、以上列舉的廣播機制具體可以使用的場景中,在實際應用中的適用性:

  1、同一app內部的同一組件內的消息通信(單個或多個線程之間),實際應用中肯定是不會用到廣播機制的(雖然可以用),無論是使用擴展變量作用域、基于接口的回調還是Handler-post/Handler-Message等方式,都可以直接處理此類問題,若適用廣播機制,顯然有些“殺雞牛刀”的感覺;

  2、同一app內部的不同組件之間的消息通信(單個進程),對于此類需求,在有些教復雜的情況下單純的依靠基于接口的回調等方式不好處理,此時可以直接使用EventBus等,相對而言,EventBus由于是針對統一進程,用于處理此類需求非常適合,且輕松解耦。

  3、其他情形,由于涉及不同進程間的消息通信,此時根據實際業務使用廣播機制會顯得非常適宜。

  三、BroadcastReceiver的具體實現流程如下:

  1、廣播接收者BroadcastReceiver通過Binder機制向AMS(Activity Manager Service)進行注冊;

  2、廣播發送者通過binder機制向AMS發送廣播;

  3、AMS查找符合相應條件(IntentFilter/Permission等)的BroadcastReceiver,將廣播發送到BroadcastReceiver(一般情況下是Activity)相應的消息循環隊列中;

  4、消息循環執行拿到此廣播,回調BroadcastReceiver中的onReceive()方法。

  四、使用EventBus框架具體流程如下:

  1、初始化時注冊EventBus.getDefault().register(this);

  2、用完之后注銷EventBus.getDefault().unregister(this);

  3、中間過程主要就是消息推送和接收了,通過EventBus.getDefault().post(param)推送,通過onEventMainThread(param),onEventPostThread(param),onEventBackgroundThread(param),onEventAsync(param)接收并處理。

  由此看來,廣播發送者和廣播接收者分別屬于觀察者模式中的消息發布和訂閱兩端,AMS屬于中間的處理中心。廣播發送者和廣播接收者的執行是異步的,發出去的廣播不會關心有無接收者接收,也不確定接收者到底是何時才能接收到。顯然,整體流程與EventBus非常類似。


查看完整回答
反對 回復 2018-07-13
  • 1 回答
  • 0 關注
  • 971 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號