1

在一个现有项目上工作时,我发现了这个相当不常见的实现部分(至少对我而言)。由于我与之前已经离开的开发人员没有联系,在我将其视为简单地从我们代码库的另一部分复制和粘贴代码的情况之前,我想向 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 Activity.finish()从扩展的 BaseActivity 中调用,而不是直接调用它(在上面的 SignActivity 中)?即使 SomeActivity 实际上是一个片段,您也可以简单地调用getActivity.finish().

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

提前感谢您满足我的好奇心。:D

4

2 回答 2

0

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

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

通过在其中添加订阅,BaseActivity我们可以确保ActivityEvent.Type.ActivityFinish使用EventBus. 如果您考虑要清除堆栈的注销情况,该方法将成为一种更安全的方法。

于 2017-08-03T18:45:17.923 回答
0

所以,这是处理这个问题。在盯着屏幕看了几次并更多地使用代码库之后,我发现以前的开发人员实际上使用了goToMain其他活动的功能(人们真的这样做吗?O_o)。尽管如此,由于仍然传递了“Activity”对象,因此我没有理由想到在这种特定场景中使用 EventBus(因为您可以只调用activity.finish())。

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


什么是事件总线

EventBus 是 Android 优化的事件总线,简化了活动、片段、线程、服务等之间的通信。

即不运行静态方法来调用活动自己的扩展功能。

于 2017-08-20T09:02:47.050 回答