Android消息总线,基于LiveData,具有生命周期感知能力,支持Sticky
简单之美
LiveEventBus实现非常简单,功能却非常强大。简单好用,就是最好的:)
LiveEventBus的特点
- 生命周期感知,消息随时订阅,自动取消订阅
- 支持Sticky粘性消息
- 支持设置LifecycleObserver(如Activity)接收消息的模式:
- 整个生命周期(从onCreate到onDestroy)都可以实时收到消息
- 激活状态(Started)可以实时收到消息,非激活状态(Stoped)无法实时收到消息,需等到Activity重新变成激活状态,方可收到消息
在工程中引用
Via Gradle:
implementation 'com.jeremyliao:live-event-bus:1.2.1'
调用方式
订阅消息
- observe 生命周期感知,不需要手动取消订阅
LiveEventBus.get()
.with("key_name", String.class)
.observe(this, new Observer<String>() {
@Override
public void onChanged(@Nullable String s) {
}
});
- observeForever 需要手动取消订阅
LiveEventBus.get()
.with("key_name", String.class)
.observeForever(observer);
LiveEventBus.get()
.with("key_name", String.class)
.removeObserver(observer);
发送消息
- setValue 在主线程发送消息
LiveEventBus.get().with("key_name").setValue(value);
- postValue 在后台线程发送消息,订阅者会在主线程收到消息
LiveEventBus.get().with("key_name").postValue(value);
Sticky模式
支持在注册订阅者的时候设置Sticky模式,这样订阅者可以接收到订阅之前发送的消息
- observeSticky 生命周期感知,不需要手动取消订阅,Sticky模式
LiveEventBus.get()
.with("sticky_key", String.class)
.observeSticky(this, new Observer<String>() {
@Override
public void onChanged(@Nullable String s){
}
});
- observeStickyForever 需要手动取消订阅,Sticky模式
LiveEventBus.get()
.with("sticky_key", String.class)
.observeStickyForever(observer);
LiveEventBus.get()
.with("sticky_key", String.class)
.removeObserver(observer);
设置LifecycleObserver接收消息的模式
- 整个生命周期(从onCreate到onDestroy)都可以实时收到消息(LiveEventBus的默认设置)
LiveEventBus.get().lifecycleObserverAlwaysActive(true);
- 激活状态(Started)可以实时收到消息,非激活状态(Stoped)无法实时收到消息,需等到Activity重新变成激活状态,方可收到消息
LiveEventBus.get().lifecycleObserverAlwaysActive(false);
混淆规则
-dontwarn android.arch.lifecycle.LiveData
-keep class android.arch.lifecycle.LiveData { *; }
-keep class android.arch.lifecycle.LifecycleRegistry { *; }
-keep class android.arch.core.internal.SafeIterableMap { *; }
其他版本
classic
- 经典实现版,整个实现就一个java文件
- 只支持激活状态(Started)可以实时收到消息,非激活状态(Stoped)无法实时收到消息,需等到Activity重新变成激活状态,方可收到消息
v2
- v2版,所有特性同master版保持一致
- 为了解决非激活态不能实时收到消息的问题,采用修改LiveData源码的方式实现,master版采用继承LiveData的方式实现
示例和DEMO
- 发送、接收消息
- Sticky模式
- 任何时候都可以订阅消息
- 一个简单的应用场景,发消息关闭所有Activity
- 快速postValue也不会丢失消息
- 整个生命周期(从onCreate到onDestroy)都可以实时收到消息
文档
LiveEventBus实现原理
LiveEventBus的实现原理可参见作者在美团技术博客上的博文: Android消息总线的演进之路:用LiveDataBus替代RxBus、EventBus
质量
- 编写了14个测试用例以确保LiveEventBus能够正常运行。
- 具体测试用例参见LiveEventBusTest
主要功能Commit记录
- 主要功能完成(Jul 11, 2018)
- 支持Sticky(Aug 8, 2018)
- 修复在后台线程PostValue会丢失消息的问题(Aug 9, 2018)
- 解决发送给Stop状态Observer消息无法及时收到的问题(Aug 18, 2018)
- 解决了Resumed状态的Activity发生订阅,订阅者会收到订阅之前发布的消息的问题。特别感谢@MelonWXD发现了这个问题(Dec 8,2018)
- 在removeObserver的时候,检查livedata上有没有observer,没有则删除这个livadata,以减少内存占用。特别感谢@GreenhairTurtle提供的解决方案(Dec 27,2018)
- 支持设置LifecycleObserver接收消息的模式,支持在整个生命周期实时接收消息和只在激活态实时接收消息两种模式(Jan 22,2019)
其他
- 欢迎提Issue与作者交流
- 欢迎提Pull request,帮助 fix bug,增加新的feature,让LiveEventBus变得更强大、更好用
More Open Source by JeremyLiao
- FastSharedPreferences 一个Android平台的高性能key-value组件
- tensorflow-lite-sdk 一个更加通用的Tensorflow-Lite Android SDK
- android-modular 一个组件化实施方案的Demo
- MessageBus 一个android平台的基于订阅-发布模式的消息框架,支持跨进程消息通信
- persistence 一个android平台的key-value storage framework
- LightRxAndroid 另辟蹊径,利用Android Handler实现了一个类似RxJava的链式框架
- rxjava-retry 封装了几个处理RxJava Retry操作的类
- retrofit-mock 一个用于Retrofit mock response数据的工具
- jacoco-android-demo AndroidStudio运行jacoco计算测试覆盖率的Demo
- android-gradle-study 深入浅出Android Gradle