粘性事件总线仅在我进入活动时才会被调用

问题描述 投票:0回答:1

我有两个活动,我试图将事件从活动 A 发送到活动 B,而不进入活动 B。

我正在尝试使用粘性事件总线来做到这一点,问题是如果我不进入活动 B,事件就不会触发。我不知道问题是,这是我在活动 B 中的代码

    override fun onStart() {
        super.onStart()
        registerEventBus()
    }


    override fun onDestroy() {
        super.onDestroy()
        unregisterEventBus()
    }

    @Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
    fun onStickyEventBus(case: EventBusType?) {
        when (case) {
            EventBusType.ONE_FOR_PAYMENT_COMPLETED ->{
                // do something
                removeEvent(case)
            }
            else -> {}
        }
    }

我的活动 A 上的代码:

...
postEvent(EventBusType.ONE_FOR_PAYMENT_COMPLETED,sticky = true)

扩展:

fun postEvent(event: Any?, sticky: Boolean = false) {
    if (sticky) EventBus.getDefault().postSticky(event)
    else EventBus.getDefault().post(event)
}

fun removeEvent(event: Any?) {
    EventBus.getDefault().removeStickyEvent(event)
}

fun Activity.registerEventBus() {
    if (!EventBus.getDefault().isRegistered(this)) {
        EventBus.getDefault().register(this)
    }
}

fun Activity.unregisterEventBus() {
    if (EventBus.getDefault().isRegistered(this)) {
        EventBus.getDefault().unregister(this)
    }
}

android kotlin android-lifecycle lifecycle event-bus
1个回答
0
投票

很可能您已经注册到 EventBus,因为您在 OnDestroy 中取消注册,并且仅在 Activity 结束时才会调用该方法。在镜像生命周期事件(例如 OnStart/OnPause)中注册/注销是一个好习惯。将 unregisterEventBus() 移至 OnPause() 应该可以修复它。

override fun onPause() {
    super.onPause()
    unregisterEventBus()
}

另一种解决方案是使用 Intents 传递数据 https://www.geeksforgeeks.org/how-to-send-data-from-one-activity-to-second-activity-in-android/

© www.soinside.com 2019 - 2024. All rights reserved.