一、它到底是什么?
解决原生 LiveData 所有 BUG 的安全版 LiveData解决 3 个致命痛点:
- 粘性事件(先发送后订阅,会收到旧消息)
- 页面旋转重建 → 消息重复触发
- 事件多次消费(弹窗 / 跳转 / Toast 重复执行)
7.3.0 是官方最终稳定版,不再更新。
二、依赖(直接复制)
gradle
arduino
implementation "com.kunminx.arch:unpeek-livedata:7.3.0"
三、7.3.0 核心 4 个类(必须记住)
表格
| 类名 | 作用 | 场景 |
|---|---|---|
| UnPeekLiveData | 页面内安全事件 | ViewModel → Activity/Fragment |
| UnPeekMutableLiveData | 可修改的 UnPeek | 外部可 setValue |
| SharedUnPeekLiveData | 跨页面全局事件 | Activity ↔ Fragment ↔ Activity |
| UnPeekBus | 全局事件总线 | 替代 EventBus、LocalBroadcast |
四、最常用:页面内事件(ViewModel + View)
1. ViewModel 中定义
kotlin
kotlin
import androidx.lifecycle.ViewModel
import com.kunminx.arch.lifecycle.UnPeekLiveData
class MyViewModel : ViewModel() {
// 定义:不可变,只内部修改
val uiEvent = UnPeekLiveData<String>()
// 发送事件
fun test() {
uiEvent.setValue("页面事件:显示Toast")
}
}
2. Activity/Fragment 观察
kotlin
javascript
viewModel.uiEvent.observe(this) { msg ->
// 安全事件
// 不会粘性、不会重建重复、只会执行一次
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show()
}
特点:
- 无粘性
- 旋转屏幕不重复回调
- 一条事件只消费一次
- 完全生命周期安全
五、可变版 UnPeekMutableLiveData
允许外部直接 setValue
kotlin
kotlin
val refreshEvent = UnPeekMutableLiveData<Boolean>()
// 使用
viewModel.refreshEvent.setValue(true)
六、跨页面通信(神器:SharedUnPeekLiveData)
用于:A 页面发送 → B 页面接收
1. 创建全局单例(管理所有共享事件)
kotlin
ini
object GlobalEvent {
val loginEvent = SharedUnPeekLiveData<Boolean>()
val userInfo = SharedUnPeekLiveData<User>()
}
2. 发送页面
kotlin
arduino
GlobalEvent.loginEvent.setValue(true)
3. 接收页面(任何界面)
kotlin
javascript
GlobalEvent.loginEvent.observe(this) { isLogin ->
// 处理登录
}
特点:
- 跨页面、跨 ViewModel
- 无粘性
- 无内存泄漏
- 无需反注册
七、全局事件总线(替代 EventBus):UnPeekBus
7.3.0 新增,极简事件总线
发送
kotlin
arduino
UnPeekBus.send("key_home_refresh", true)
接收
kotlin
kotlin
UnPeekBus.observe<Boolean>(this, "key_home_refresh") {
// 刷新首页
}
完全替代 EventBus、LocalBroadcastManager、RxBus
八、7.3.0 最重要特性(必看)
- 真正无粘性
- 屏幕旋转不重复回调
- 一条事件只会被消费一次
- 生命周期安全
- 无反射、无内存泄漏、无需解绑
- 100% 兼容原生 LiveData 写法
- 支持 Kotlin & Java
九、最关键使用规则(非常重要)
1. 状态数据 用 LiveData
列表、文字、UI 显示状态(可恢复)
2. 一次性事件 用 UnPeekLiveData
跳转、弹窗、Toast、提示、事件(只执行一次)
3. 跨页面 用 SharedUnPeekLiveData / UnPeekBus
十、和原生 LiveData 对比(一眼看懂)
表格
| 场景 | 普通 LiveData | UnPeekLiveData 7.3.0 |
|---|---|---|
| 先发送后订阅 | 会收到旧消息(粘性) | 不会 |
| 屏幕旋转 | 重复回调 | 不回调 |
| 事件只执行一次 | 不保证 | 保证 |
| 内存安全 | 一般 | 安全 |
| 跨页面 | 不支持 | 支持 |
十一、最终总结(架构必背)
UnPeekLiveData 7.3.0 = 现代 Android 架构 官方标准事件解决方案
-
页面内事件 → UnPeekLiveData
-
跨页面事件 → SharedUnPeekLiveData
-
全局简单事件 → UnPeekBus