天天看點

HermesEventBus-餓了麼開源的Android跨程序事件分發架構

由于Android不同程序之前不能互相通信,是以當開發過程中遇到跨程序通信的時候,常用的方案就是AIDL(Android Interface Definition Language)通過它我們可以定義程序間的通信接口,但是當應用中出現大量跨程序通信的時候,比如你想體驗一下插件化開發或者特殊需求在單應用中需要開多個程序,那麼寫過AIDL的同學都會有痛不欲生的感覺。現在福利來了,可以試試餓了麼開源了一款程序間事件分發的庫—HermesEventBus。

在介紹HermesEventBus之前先簡單介紹一下它底層依賴的庫Hermes—-同樣是由餓了麼Android資深工程師趙立飛操刀的一套新穎巧妙易用的Android程序間通信IPC架構,開發Hermes的初衷是為了解決插件化架構DroidPlugin的主從程序通信困難的問題,最後實作的效果是将程序間通信變的像調用本地函數一樣友善簡單,并且支援程序間函數回調和垃圾回收。

想了解更多,請移步飛神的Hermes,下面開始正式介紹HermesEventBus。

HermesEventBus

Hermes-EventBus是一個基于EventBus的、能在程序間發送和接收event的庫,在IPC或者插件開發中非常有用。它底層基于EventBus,并且和EventBus有相同API。

原理

事件收發是基于EventBus,IPC通信是基于Hermes。Hermes是一個簡單易用的Android IPC庫。

HermesEventBus-餓了麼開源的Android跨程式事件分發架構

首先選一個程序作為主程序,将其他程序作為子程序。

每次一個event被發送都會經過以下四步:

1、使用Hermes庫将event傳遞給主程序。

2、主程序使用EventBus在主程序内部發送event。

3、主程序使用Hermes庫将event傳遞給所有的子程序。

4、每個子程序使用EventBus在子程序内部發送event。

用法

能在app内實作多程序event收發,也可以跨app實作event收發。

單一app内的用法

如果你在單一app内進行多程序開發,那麼隻需要做以下三步:

Step 1

在gradle檔案中加入下面的依賴:

dependencies {
    compile 'xiaofei.library:hermes-eventbus:0.1.1'
}
           

Step 2

在Application的onCreate中加上以下語句進行初始化:

Step 3

每次使用EventBus的時候,用HermesEventBus代替EventBus。

HermesEventBus.getDefault().register(this);
HermesEventBus.getDefault().post(new Event());
           

HermesEventBus也能夠在一個程序間傳遞event,是以如果你已經使用了HermesEventBus,那麼就不要再使用EventBus了。

多個app間的用法(使用DroidPlugin的時候就是這種情況)

如果你想在多個app間收發event,那麼就做如下幾步:

Step 1

在每個app的gradle檔案中加入依賴:

dependencies {
    compile 'xiaofei.library:hermes-eventbus:0.1.1'
}
           

Step 2

選擇一個app作為主app。你可以選擇任意app作為主app,但最好選擇那個存活時間最長的app。

在使用DroidPlugin的時候,你可以把宿主app作為主app。

在主app的AndroidManifest.xml中加入下面的service:

<service android:name="xiaofei.library.hermes.HermesService$HermesService0"/>
           

你可以加上一些屬性。

Step 3

在app間收發的事件類必須有相同的包名、相同的類名和相同的方法。

務必記住在代碼混淆的時候将這些類keep!!!

Step 4

在主app的application類的onCreate方法中加入:

在其他app的Application類的onCreate方法中加入:

“packageName”指的是主app的包名。

Step 5

每次使用EventBus的時候,用HermesEventBus代替EventBus。

HermesEventBus.getDefault().register(this);
HermesEventBus.getDefault().post(new Event());
           

HermesEventBus也能夠在一個程序間傳遞event,是以如果你已經使用了HermesEventBus,那麼就不要再使用EventBus了。

HermesEventBus 現已開源,歡迎大家前去提PR。

原文:https://elelogistics.github.io/2016/07/13/HermesEventBus-%E4%B8%80%E7%A7%8D%E6%96%B0%E7%9A%84Android%E8%B7%A8%E8%BF%9B%E7%A8%8B%E4%BA%8B%E4%BB%B6%E5%88%86%E5%8F%91%E6%A1%86%E6%9E%B6/?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io

繼續閱讀