使用 EventBus 从 Base Activity 完成一个 Activity?

Using EventBus to finish an Activity from Base Activity?

在处理现有项目时,我发现这个实现相当不常见(至少对我而言)。由于我没有与已经离开的前任开发人员联系,并且在我认为这是简单地从我们代码库的另一部分复制和粘贴代码之前,我想向 SO 社区询问这个问题。

这是您的日常 activity 扩展 BaseActivity 和实现:

class SomeActivity : BaseActivity(R.layout.some_activity) {
    ...
    private fun close() {
        if(backToMain)
            finish()
        } 
        else
            goToMain(this)
    }

    companion object {
        fun goToMain(activity: AppCompatActivity) {
            val intent = Intent(activity, MainActivity::class.java)
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK)
            activity.startActivity(intent)
            EventBus.getDefault().post(Event(Event.Type.ActivityFinish))
        }
    }
    ...
}

在 BaseActivity.kt 中,订阅了调用 finish() 的事件。

@Subscribe override fun onEvent(event: Event) {
    when (event.type) {
        Event.Type.ActivityFinish -> super.finish()
        else -> {}
    }
}

现在,为什么有人会使用 EventBus 从扩展的 BaseActivity 中调用 Activity.finish(),而不是当场调用它(在上面的 SignActivity 中)? 即使 SomeActivity 实际上是一个片段,您也可以简单地调用 getActivity.finish().

*关于意图标志,如果您的最小 SDK 为 16,您也可以使用 Activity.finishAffinity() 完成返回堆栈中的所有活动。

在此先感谢您满足我的好奇心。 :D

更新 - 这个答案是在提到项目使用最低 Api 级别 16 之前。

我查看了您的代码,我认为开发人员的意图非常好。他想从堆栈中清除所有活动。就像这里他使用 FLAG_ACTIVITY_CLEAR_TOPFLAG_ACTIVITY_NEW_TASK 但它需要 API level > 11.

通过在 BaseActivity 中添加订阅,我们可以确保 Activity 在使用 EventBus 广播 Event.Type.ActivityFinish 标签后将不再存在。如果您考虑要清除堆栈的注销情况,该方法将作为一种更安全的方法。

所以,这是解决这个问题的方法。在盯着屏幕几次并更多地使用代码库之后,我发现以前的开发人员实际上使用了其他活动中的 goToMain 函数(人们真的这样做吗?O_o)。尽管如此,由于仍然传递了 "Activity" 对象,因此我没有理由考虑在这种特定情况下使用 EventBus(因为您可以调用 activity.finish())。

总之,开发人员可能只是从应用程序的不同部分改编了这段代码,认为这就是它的工作原理。


什么是EventBus

EventBus is an Android optimized event bus that simplifies communication between Activities, Fragments, Threads, Services, etc.

即不是 运行 调用 activity 自己的扩展函数的静态方法。