Android組件化之(路由 vs 組件總線)

前言

以前寫了一篇關於總結一波安卓組件化開源方案的文章,反響還不錯。後來,在QQ交流羣(686844583)裏有人問到通訊機制這一對比項中路由組件總線的區別。因爲通訊機制是組件化架構的核心引擎,是理論基礎,本文講解一下我對這兩種通訊機制的理解。git

相同點

路由和組件總線都須要將分佈在不一樣組件module中的某些類按照必定規則生成映射表(數據結構一般是Map,Key爲一個字符串,Value爲類或對象),而後在須要用到的時候從映射表中根據字符串從映射表中取出類或對象github

不一樣點

1. 路由方案(如:ARouter等)

1.1 路由的本質是類的查找編程

其工做原理相似於倉庫管理員:你們先把類所有放到倉庫中,有人須要的時候,倉庫管理員就根據所提供的字符串找出存放在倉庫中的類服務器

查找的類主要分爲3種:Activity子類、Fragment子類和自定義接口實現類數據結構

  • Activity子類: 路由庫提供startActivity(或startActivityForResult)的封裝,並根據字符串從映射表中獲取對應的Activity類(XxxActivity.class),跳轉到該Activity頁面
  • Fragment子類:路由庫根據字符串從映射表中獲取對應的Fragment類(XxxFragment.class)並建立一個對象返回給調用方
  • 自定義接口實現類:路由庫根據字符串(註解的字符串或者接口類名字符串)從映射表中獲取對應接口的實現類(XxxInterfaceImpl.class),並建立一個對象返回給調用方

1.2 路由這種一對一的類映射關係理解起來比較容易,特別是頁面跳轉,使用起來也很方便架構

1.3 組件之間的服務調用時,調用方須要持有接口類,須要將接口類定義下沉到base層,向接口編程,遵循依賴倒置原則app

1.4 因爲路由本質是類查找,因此須要通訊的組件必需要打包在同一個app內部才能獲取到。框架

在組件單獨運行調試時要將與之通訊的組件添加到本身的依賴列表中(比較常見的是必須依賴登陸組件),既然開發過程當中添加了依賴,開發人員就能直接調用到其它組件的代碼,爲了不這種狀況,須要作代碼隔離,獲得的組件化框架DDComponentForAndroid經過插件很好地作到了這一點。ide

2. 組件總線方案(如:CC等)

2.1 組件總線的本質是轉發調用請求組件化

其工做原理相似於電話接線員(中介者模式):組件總線負責收集全部組件類並造成映射表(Key爲字符串,Value爲組件類的對象)。調用組件時,總線根據字符串找到對應的組件類並將調用信息轉發給該組件類,組件執行完成後再經過組件總線將結果返回給調用方

2.2 組件總線只負責通訊,即轉發調用請求和返回執行結果。

2.3 不須要下沉接口,面向通訊協議編程(相似於app客戶端調用服務器端接口的通訊協議)

2.4 因爲組件總線的本質是轉發調用請求,能夠經過跨進程通訊方式將調用請求轉發給其它app,從而實現跨app進行組件調用。

Tips: 跨進程通訊的方式有不少種,例如:
BroadcastReceiver、Socket、FileObserver、MemoryFile、UrlScheme、ContentProvider、AIDL、Messenger及Binder等等
複製代碼

支持跨app的組件調用後,單組件做爲app運行時,能夠與主app進行通訊,調用主app中的全部組件,無需與其餘組件一塊兒打包運行,全部的組件都是平行的,沒有依賴關係,帶來的好處有:

  • 從框架層面避免了組件之間的依賴,作到徹底的代碼隔離。
  • 組件獨立運行時編譯速度更快
  • 老項目改造時,從第一個組件開始就能夠獨立運行,而不會由於須要調用到組件外的功能而必須跟主工程一塊兒打包運行調試

總結

通訊機制是Android組件化技術的基石,本文講述了兩種主要實現方式的相同點和不一樣點。

相關文章
相關標籤/搜索