1. 程式人生 > >HermesEventBus-餓了麼開源的Android跨程序事件分發框架

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庫。

這裡寫圖片描述

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

每次一個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了。

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