Android的BroadcastReceiver和EventBus區別是什麼
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開發實戰視訊教程
相關文章
- 什麼是PCB?什麼是PCBA?PCB和PCBA的區別?
- cat和vim的區別是什麼?
- python is和==的區別是什麼?Python
- HIVE和HBASE的區別是什麼Hive
- JDO和JPA的區別是什麼?
- cookie是什麼?和session有什麼區別?CookieSession
- Mssql和Mongodb區別是什麼SQLMongoDB
- powershell和cmd區別是什麼
- Android 中的Dalvik和ART是什麼,有啥區別?Android
- 前端和後端的區別是什麼?前端後端
- ArrayList和LinkedList的區別是什麼
- disabled和readonly的區別是什麼
- 《openstack 和hadoop的區別是什麼?》Hadoop
- 轉:samba和NFS的區別是什麼?SambaNFS
- decimal,float和double的區別是什麼?Decimal
- 過渡和動畫的區別是什麼?動畫
- Java和Python是什麼?有什麼區別?JavaPython
- SCRM是什麼,SCRM和CRM區別?
- text(),val()和html()區別是什麼HTML
- Android 中 EventBus 的使用(1):為什麼要使用 EventBusAndroid
- HTTP和HTTPS是什麼 二者區別是什麼HTTP
- 連梁和框架樑的區別是什麼?框架
- reactjs和vuejs的區別是什麼ReactJSVue
- Kata和Kaizen之間的區別是什麼?AI
- 【Java面試】Mybatis中#{}和${}的區別是什麼?Java面試MyBatis
- border:0和border:none的區別是什麼None
- EJB和Java Beans的區別是什麼啊JavaBean
- 什麼是HTTP? HTTP 和 HTTPS 的區別?HTTP
- 什麼是報表工具?和 EXCEL 有什麼區別?Excel
- Java 介面和抽象類是什麼,有什麼區別Java抽象
- 什麼是 MicroPython?和CPython有什麼區別?Python
- 什麼是SCRM系統?和CRM有什麼區別?
- png是什麼格式 png和jpg有什麼區別
- xpgu是什麼 xgpu和xgp有什麼區別GPU
- Android JNI和NDK有什麼區別Android
- 你和架構師的的區別是什麼?架構
- Object.create(null) 和 {} 區別是什麼ObjectNull
- 深入探究Java中equals()和==的區別是什麼Java