Android的BroadcastReceiver和EventBus區別是什麼

帶著紅領巾的雷鋒發表於2015-05-27

enter image description here   

BroadcastReceiver是什麼鬼?在Android中廣播分為兩個方面:廣播傳送者和廣播接收者,通常情況下,BroadcastReceiver指的就是廣播接收者(廣播接收器)。

  EventBus又是什麼鬼呢?EventBus是一個釋出 / 訂閱的事件匯流排。簡單點說,就是兩人約定好怎麼通訊,一人釋出訊息,另外一個約定好的人立馬接收到你發的訊息。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非常類似。

   以上就是BroadcastReceiver和EventBus區別介紹,希望對你有幫助。

推薦學習:Android開發實戰視訊教程

相關文章