【问题标题】:How to communicate between activities in Android如何在 Android 中的 Activity 之间进行通信
【发布时间】:2020-03-23 22:55:26
【问题描述】:

我是 Android 新手(但不是 java 新手),我对服务、ViewModel、广播以及用于在活动之间进行通信的其他替代方案感到困惑。我的沟通需求非常基本。

考虑MidiscopeMainActivity。我想做类似的事情,但使用 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,但有两件事我不清楚,所以也许这不是解决我的问题的正确方法:

    1. 我应该在onHandleIntent 中做什么?我的 Intent 本身什么也不做,它应该只是从 MIDI 到我的 UI 之间的传递
    2. 如何从上述两个活动中访问和使用 IntentService?当然,单例模式,但是如何确保我不会创建与共享 Activity 的静态实例导致的相同问题?

【问题讨论】:

  • “活动之间的通信”——Google 的建议是活动少,并为不同的屏幕使用片段。 “我试过 ViewModel”——这在活动之间没有帮助。 “然后我尝试了 IntentService”——IntentService 在一年前被弃用,并且不是为交互活动通信而设计的。它旨在完成一些事务性工作,例如网络调用。 “我的沟通需求非常基本”——你能解释一下它们是什么吗?是否只是在您开始活动时将参数从一个传递到另一个?
  • @CommonsWare 既然至少有两个人这么认为,那我肯定没有解释清楚。然而,除了重复我在问题中写的内容(我不是英语母语人士)之外,我不知道如何描述它:“考虑 Midiscope 的 MainActivity。我想做类似的事情,但使用 Spinner 来选择源不同的活动”。
  • “考虑 Midiscope 的 MainActivity”——很少有人会熟悉这个示例应用程序,因为它看起来相当专业 (MIDI)。与其参考那个应用程序,不如考虑用自己的话解释你想做什么。

标签: android android-service ui-thread


【解决方案1】:

如果你想将一些基本数据从一个活动传递到另一个活动,你应该使用Intent

使用方法:

Activity1(向Activity2发送数据):

Intent intent = new Intent(context, TextViewActivity.class);
intent.putExtra("EXTRA_SESSION_ID", sessionId);
startActivity(intent);

Activity2(从 Activity1 接收数据):

String sessionId = getIntent().getStringExtra("EXTRA_SESSION_ID");

【讨论】:

  • 正如我在问题中所写,我试图传递一个对象(例如活动本身)而不是基本数据类型,例如字符串。
【解决方案2】:

问题是我正在考虑以“桌面”模式开发 java(例如使用 Swing),其中窗口是持久对象,不像 Android 中的活动总是来来去去。

我的解决方案是将 LoggingReceiver 构造函数设为私有,并使用单例模式将 LoggingReceiver 设为自己的工厂(即使用 getInstance() 方法返回唯一存在的 static 实例)。然后SettingsActivityTextViewActivity 都可以访问它。前者将接收器连接到正确的 MIDI 源,后者将自己注册为 ScopeLogger。显然,我还需要一个setScopeLogger()(由TextViewActivity 在其onCreate() 中调用)和LoggingReceiver.onSend() 中的一些空检查,如果mLogger 未设置,因为原始代码假定这会在构造函数中发生。但这部分在 java 中“一切照旧”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多