Android SharedFlow实现事件总线

写个demo测试下,sharedFlow实现事件监听。

添加依赖:

复制代码
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3")

定义事件:

Kotlin 复制代码
package com.example.testnavigation

/**
 * 定义事件
 */
// 普通消息事件
data class MessageEvent(val content: String)
// 登录状态事件
data class LoginEvent(val isLogin: Boolean)

SharedFlow事件总线:

Kotlin 复制代码
package com.example.testnavigation

import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.launch

/**
 * SharedFlow 事件总线(单例,全局唯一)
 */
object EventBus {
    // 1. 定义可变的 SharedFlow(内部使用,用于发送事件)
    // replay = 0:不缓存旧事件(非粘性)
    // extraBufferCapacity = 10:缓冲队列大小
    private val _events = MutableSharedFlow<Any>(replay = 0, extraBufferCapacity = 10)

    // 2. 对外暴露不可变的 SharedFlow(用于订阅事件)
    val events: SharedFlow<Any> = _events

    // 3. 全局协程作用域(发送事件用)
    private val scope = CoroutineScope(Dispatchers.IO)

    /**
     * 发送事件
     */
    fun post(event: Any) {
        scope.launch {
            _events.emit(event) // 发射事件
        }
    }
}
复制代码
MainActivity订阅事件:
Kotlin 复制代码
package com.example.testnavigation

import android.content.Intent
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import androidx.fragment.app.FragmentActivity
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach

class MainActivity : FragmentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main1)
        findViewById<Button>(R.id.btn_goto_second).setOnClickListener {
            startActivity(Intent(this@MainActivity, MainActivity2::class.java))
        }

        // 订阅 MessageEvent 事件
        EventBus.events
            .filter { it is MessageEvent } // 只接收 MessageEvent 类型
            .onEach { event ->
                // 收到事件,处理逻辑
                val msg = event as MessageEvent
                println("收到消息:${msg.content}")
                val tv_msg = findViewById<TextView>(R.id.tv_msg)
                tv_msg.text = msg.content
            }
            .launchIn(CoroutineScope(Dispatchers.Main)) // 生命周期绑定

        // 订阅 LoginEvent 事件
        EventBus.events
            .filter { it is LoginEvent }
            .onEach { event ->
                val login = event as LoginEvent
                println("登录状态:${login.isLogin}")
            }
            .launchIn(CoroutineScope(Dispatchers.Main))
    }
}

第二个activity发送事件:

Kotlin 复制代码
package com.example.testnavigation

import android.os.Bundle
import android.widget.Button
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch

class MainActivity2: FragmentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_2)
        findViewById<Button>(R.id.btn_send_event).setOnClickListener {
            EventBus.post(MessageEvent("竹外桃花三两枝,春江水暖鸭先知"))
            lifecycleScope.launch {
                delay(1000)
                finish()
            }
        }
    }
}

运行:

点击跳转到第二个activity:

点击发送数据:

ok. 实现了和以前eventBus一样的效果,还简单,不用写注解。

相关推荐
2501_916007477 分钟前
苹果商店iOS应用上架费用全面解析:开发者计划与审核费用计算
android·ios·小程序·https·uni-app·iphone·webview
Android打工仔9 分钟前
Kotlin 协程源码解析:协程是如何切换线程的?
android·kotlin
mmsx9 分钟前
Android GIS系列 内存加锁、SQLite 开事务:矢量数据集双层并发设计
android·性能优化·app
Godikov12 分钟前
没有 adb 怎么排查接口问题?给 OkHttp 加一个"永不炸"的文件日志拦截器
android
邪修king1 小时前
Re:Linux 系统篇(三十四):进程间通信开篇Chapter1 —— 匿名管道 pipe 深度拆解与代码实战
android·linux·运维·开发语言
AFinalStone1 小时前
Android7 SystemUI 源码解析(一)全景概览与架构设计
android·systemui
2501_916008892 小时前
如何实现iOS App代码混淆:SwiftShield使用指南
android·ios·小程序·https·uni-app·iphone·webview
恋猫de小郭2 小时前
AndroidX 新增 Security State ,支持可编程的系统安全状态查询
android·前端·flutter
AFinalStone3 小时前
Android7 SystemUI 源码解析(六)QuickSettings快捷设置面板
android·systemui
Kapaseker3 小时前
你有搞明白 Volatile 什么意思吗?
android·kotlin