【发布时间】:2020-03-23 22:55:26
【问题描述】:
我是 Android 新手(但不是 java 新手),我对服务、ViewModel、广播以及用于在活动之间进行通信的其他替代方案感到困惑。我的沟通需求非常基本。
考虑Midiscope 的MainActivity。我想做类似的事情,但使用 Spinner 在不同的 Activity 上选择源。基本上是 Spinner 的一个 Activity(称为“SettingsActivity”,但显然不能是真正的设置,原因是这个边距太长)和另一个带有 TextView 的 UI Activity,称为 TextViewActivity。如果我共享静态变量以从设置访问 TextViewActivity,我可以让它工作,这样我就可以从设置创建 LoggingReceiver,但将它绑定到 TextViewActivity 而不是设置 (this)。显然这是不对的(TM),所以我尝试了所有我可以用谷歌搜索的选项都无济于事。实现这一目标的最简单方法是什么?
我尝试了ViewModel,文档中的示例在
MyViewModel model = new ViewModelProvider(this).get(MyViewModel.class);处崩溃error: no suitable constructor found for ViewModelProvider(MyActivity)(是的,我在该文档页面上投了 1 星)。从接受的答案到question about it(即使用new ViewModelProvider.NewInstanceFactory())的“解决方案”与java.lang.RuntimeException: Cannot create an instance of class com.example.MyViewModel一起崩溃-
然后我尝试了https://developer.android.com/guide/components/services 中描述的 IntentService,但有两件事我不清楚,所以也许这不是解决我的问题的正确方法:
- 我应该在
onHandleIntent中做什么?我的 Intent 本身什么也不做,它应该只是从 MIDI 到我的 UI 之间的传递 - 如何从上述两个活动中访问和使用 IntentService?当然,单例模式,但是如何确保我不会创建与共享 Activity 的静态实例导致的相同问题?
- 我应该在
【问题讨论】:
-
“活动之间的通信”——Google 的建议是活动少,并为不同的屏幕使用片段。 “我试过 ViewModel”——这在活动之间没有帮助。 “然后我尝试了 IntentService”——
IntentService在一年前被弃用,并且不是为交互活动通信而设计的。它旨在完成一些事务性工作,例如网络调用。 “我的沟通需求非常基本”——你能解释一下它们是什么吗?是否只是在您开始活动时将参数从一个传递到另一个? -
@CommonsWare 既然至少有两个人这么认为,那我肯定没有解释清楚。然而,除了重复我在问题中写的内容(我不是英语母语人士)之外,我不知道如何描述它:“考虑 Midiscope 的 MainActivity。我想做类似的事情,但使用 Spinner 来选择源不同的活动”。
-
“考虑 Midiscope 的 MainActivity”——很少有人会熟悉这个示例应用程序,因为它看起来相当专业 (MIDI)。与其参考那个应用程序,不如考虑用自己的话解释你想做什么。
标签: android android-service ui-thread