一、前言:
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