一、前言:
LiveEventBus是一款Android消息總線,基於LiveData,具有生命週期感知能力,支持Sticky,支持AndroidX,支持跨進程,支持跨APP。
爲什麼要用LiveEventBus?
1、生命週期感知
- 消息隨時訂閱,自動取消訂閱
- 告別消息總線造成的內存泄漏
- 告別生命週期造成的崩潰
2、範圍全覆蓋的消息總線解決方案
- 進程內消息發送
- App內,跨進程消息發送
- App之間的消息發送
3、 更多特性支持
- 免配置直接使用,懶人最愛
- 支持Sticky粘性消息
- 支持AndroidX
- 支持延遲發送
- 觀察者的多種接收模式(全生命週期/激活狀態可接受消息)
4、 常用消息總線對比
消息總線 | 延遲發送 | 有序接收消息 | Sticky | 生命週期感知 | 跨進程/APP | 線程分發 |
---|---|---|---|---|---|---|
EventBus | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ |
RxBus | ❌ | ❌ | ✅ | ❌ | ❌ | ✅ |
LiveEventBus | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
想了解更多?請點擊:全面瞭解Android消息總線
demo下載:https://github.com/JeremyLiao/LiveEventBus.git
二、使用:
1、依賴:
Via Gradle:
implementation 'com.jeremyliao:live-event-bus:1.7.2'
For AndroidX:
implementation 'com.jeremyliao:live-event-bus-x:1.7.2'
2、訂閱消息
- 以生命週期感知模式訂閱消息
LiveEventBus
.get("some_key", String.class)
.observe(this, new Observer<String>() {
@Override
public void onChanged(@Nullable String s) {
}
});
- 以Forever模式訂閱消息
LiveEventBus
.get("some_key", String.class)
.observeForever(observer);
3、發送消息
- 不定義消息直接發送
LiveEventBus
.get("some_key")
.post(some_value);
- 先定義消息,再發送消息
//定義類型
public class DemoEvent implements LiveEvent {
public final String content;
public DemoEvent(String content) {
this.content = content;
}
}
//發送消息
LiveEventBus
.get(DemoEvent.class)
.post(new DemoEvent("Hello world"));
4、在Application.onCreate方法中配置:
LiveEventBus
.config()
.autoClear(true)
.lifecycleObserverAlwaysActive(true);
lifecycleObserverAlwaysActive
配置LifecycleObserver(如Activity)接收消息的模式(默認值true):
true:整個生命週期(從onCreate到onDestroy)都可以實時收到消息
false:激活狀態(Started)可以實時收到消息,非激活狀態(Stoped)無法實時收到消息,需等到Activity重新變成激活狀態,方可收到消息autoClear
配置在沒有Observer關聯的時候是否自動清除LiveEvent以釋放內存(默認值false)setJsonConverter
配置JsonConverter(默認使用gson)setLogger
配置Logger(默認使用DefaultLogger)enableLogger
配置是否打印日誌(默認打印日誌)setContext
如果廣播模式有問題,請手動傳入Context,需要在application onCreate中配置
三、詳細使用文檔
1、 獲取Observable
- 通過name獲取Observable
Observable<T> get(@NonNull String key, @NonNull Class<T> type)
Observable<Object> get(@NonNull String key)
- 通過event type獲取Observable
<T extends LiveEvent> Observable<T> get(@NonNull Class<T> eventType)
2、 消息發送
進程內發送消息
void post(T value)
App內發送消息,跨進程使用
void postAcrossProcess(T value)
App之間發送消息
void postAcrossApp(T value)
進程內發送消息,延遲發送
void postDelay(T value, long delay)
進程內發送消息,延遲發送,帶生命週期
void postDelay(LifecycleOwner sender, T value, long delay)
進程內發送消息,有序發送
void postOrderly(T value)
以廣播的形式發送一個消息
- 需要跨進程、跨APP發送消息的時候調用該方法
- 建議儘量使用postAcrossProcess、postAcrossApp
void broadcast(T value, boolean foreground, boolean onlyInApp)
3、 消息訂閱
以生命週期感知模式訂閱消息
- 具有生命週期感知能力,LifecycleOwner銷燬時自動取消訂閱,不需要調用removeObserver
void observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer)
以Forever模式訂閱和取消訂閱消息
- Forever模式訂閱消息,需要調用removeObserver取消訂閱
void observeForever(@NonNull Observer<T> observer)
取消訂閱消息
void removeObserver(@NonNull Observer<T> observer)
Sticky模式訂閱消息
- Sticky模式
- 支持在訂閱消息的時候設置Sticky模式,這樣訂閱者可以接收到之前發送的消息。
- 以Sticky模式訂閱消息,具有生命週期感知能力,LifecycleOwner銷燬時自動取消訂閱,不需要調用removeObserver
void observeSticky(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer)
Sticky模式Forever訂閱消息
- Forever模式訂閱消息,需要調用removeObserver取消訂閱,Sticky模式
void observeStickyForever(@NonNull Observer<T> observer)
4、 跨進程消息
支持對基本數據類型消息的跨進程發送
- int
- float
- long
- boolean
- double
- String
支持Serializable和Parcelable類型消息的跨進程發送
- 提供SerializableProcessor
- 提供ParcelableProcessor
支持Bean類型消息的跨進程發送
- 提供GsonProcessor以Gson方式提供支持
- 需要用註解@IpcConfig指定GsonProcessor:
@IpcConfig(processor = GsonProcessor.class)
支持自定義擴展
- 實現自定義Processor,實現Processor接口
- 用註解@IpcConfig指定自定義Processor
5、 配置
在Application.onCreate方法中配置:
LiveEventBus
.config()
...
lifecycleObserverAlwaysActive 配置LifecycleObserver(如Activity)接收消息的模式(默認值true)
autoClear 配置在沒有Observer關聯的時候是否自動清除LiveEvent以釋放內存(默認值false)
更多配置信息,請點擊:LiveEventBus的配置
6、混淆規則
-dontwarn com.jeremyliao.liveeventbus.**
-keep class com.jeremyliao.liveeventbus.** { *; }
-keep class android.arch.lifecycle.** { *; }
-keep class android.arch.core.** { *; }
for androidx:
-dontwarn com.jeremyliao.liveeventbus.**
-keep class com.jeremyliao.liveeventbus.** { *; }
-keep class androidx.lifecycle.** { *; }
-keep class androidx.arch.core.** { *; }
參考:LiveEventBus