餓了么開源的Android跨進程事件分發框架HermesEventBus
由于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庫。
首先選一個進程作為主進程,將其他進程作為子進程。
每次一個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中加上以下語句進行初始化:
HermesEventBus.getDefault().init(this);
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方法中加入:
HermesEventBus.getDefault().init(this);
在其他app的Application類的onCreate方法中加入:
HermesEventBus.getDefault().connectApp(this, packageName);
“packageName”指的是主app的包名。
Step 5
每次使用EventBus的時候,用HermesEventBus代替EventBus。
HermesEventBus.getDefault().register(this);
HermesEventBus.getDefault().post(new Event());
HermesEventBus也能夠在一個進程間傳遞event,所以如果你已經使用了HermesEventBus,那么就不要再使用EventBus了。