【发布时间】:2018-03-25 10:25:15
【问题描述】:
我最近决定仔细研究 Google 发布的新 Android 架构组件,尤其是使用他们的 ViewModel 生命周期感知类到 MVVM 架构和 LiveData。
只要我处理单个 Activity 或单个 Fragment,一切都很好。
但是,我找不到处理活动切换的好解决方案。 比如说,为了一个简短的例子,Activity A 有一个启动 Activity B 的按钮。
startActivity() 会在哪里处理?
按照 MVVM 模式,clickListener 的逻辑应该在 ViewModel 中。但是,我们希望避免在其中引用 Activity。因此,将上下文传递给 ViewModel 不是一种选择。
我缩小了几个看起来“可以”的选项,但找不到“这里是如何做”的任何正确答案。
选项 1:在 ViewModel 中有一个枚举,其值映射到可能的路由(ACTIVITY_B、ACTIVITY_C)。将此与 LiveData 结合使用。 Activity 会观察这个 LiveData,当 ViewModel 决定应该启动 ACTIVITY_C 时,它只是 postValue(ACTIVITY_C)。然后Activity就可以正常调用startActivity()了。
选项 2 :常规界面模式。原理与选项 1 相同,但 Activity 将实现接口。不过,我觉得与此有更多的耦合。
选项 3 :消息选项,例如 Otto 或类似选项。 ViewModel 发送一个广播,Activity 接收它并启动它必须要做的事情。此解决方案的唯一问题是,默认情况下,您应该将该广播的注册/注销放在 ViewModel 中。所以没有帮助。
选项 4:在某处有一个大的路由类,如单例或类似的,可以调用它来将相关路由分派给任何活动。最终通过接口?所以每个活动(或 BaseActivity)都会实现
IRouting { void requestLaunchActivity(ACTIVITY_B); }
当你的应用开始有很多片段/活动时,这个方法让我有点担心(因为路由类会变得非常庞大)
就是这样。那是我的问题。你们怎么处理这个? 你会选择我没有想到的选择吗? 您认为哪个选项最相关,为什么? 推荐的 Google 方法是什么?
PS : 没有把我带到任何地方的链接 1 - Android ViewModel call Activity methods 2 - How to start an activity from a plain non-activity java class?
【问题讨论】:
标签: android mvvm android-architecture-components