使用EventBus完成基本活动的活动?

时间:2017-08-03 15:24:35

标签: android kotlin event-bus greenrobot-eventbus-3.0

在现有项目上工作,我发现这个相当罕见的实现(至少对我来说)。由于我没有与之前已经离开的开发人员联系过,而在我将此视为简单地从代码库的另一部分复制和粘贴代码的情况之前,我想向SO社区询问此事。

这是您扩展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()

*关于意图标志,如果您的min SDK为16,您还可以使用Activity.finishAffinity()完成后台堆栈中的所有活动。

提前感谢我的好奇心。 :d

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

所以,在这里处理这个问题。在屏幕上多次盯着屏幕并且更多地使用代码库之后,我发现前一个开发人员实际上使用了其他活动中的goToMain函数(人们真的这样做了吗?O_o)。尽管如此,自从"活动"对象仍然通过,我没有理由在这个特定场景中考虑使用EventBus(因为你可以调用activity.finish())。

总之,开发人员可能只是从应用的不同部分调整了这一部分代码,认为这是它的工作原理。

什么是 EventBus

  

EventBus是一款简化的Android优化事件总线   沟通 活动,碎片,线程,服务等

即。没有运行静态方法来调用活动自己的扩展函数。