【问题标题】:Object sharing between multiple activities多个活动之间的对象共享
【发布时间】:2018-02-25 15:17:14
【问题描述】:

我想在 3 个活动之间共享一个对象(具有多个状态),并且任何活动都可以修改对象状态,并且所有 3 个活动都应该可以访问相同的状态。 我不想使用单例对象,因为它将存在于整个应用程序中。 共享对象应该只持续到这 3 个活动存在的时间。

【问题讨论】:

  • 如果您愿意,您可以将一个单点对象设置为 null,并且它不会在整个应用程序中持续存在。另一个答案是使用观察者模式或 EventBus 库来发送和接收来自其他活动或片段的信息。
  • 感谢您的回答。你能告诉我观察者模式在这里有什么帮助吗?
  • EventBus 是一个使用观察者模式的库。你可以搜索 EventBus 观察者模式,你会得到很多文章或例子。您可以通过在每个活动上实现接口(侦听器回调)并通过应用程序类(名称寄存器(MyCallback 回调))将这些活动添加到侦听器列表来实现观察者模式。是的,监听器列表或观察者的应用程序不应为空。 onStart 添加(注册)要列出的活动和 onPause 删除(取消注册)活动。如果您知道观察者模式,您可能知道这是一种广泛使用的常见模式。

标签: android


【解决方案1】:

单例仍然是管理此问题的最佳方式。

class Singleton {
  static private Singleton _instance = null;
  static private boolean _activity1 = false;
  static private boolean _activity2 = false;
  static private boolean _activity3 = false;
  static public register(Activity activity) {
    _instance = null;
    if (activity instanceOf Activity1) _activity1 = true;
    if (activity instanceOf Activity2) _activity2 = true;
    if (activity instanceOf Activity3) _activity3 = true;
  }
  static public unregister(Activity activity) {
    _instance = null;
    if (activity instanceOf Activity1) _activity1 = false;
    if (activity instanceOf Activity2) _activity2 = false;
    if (activity instanceOf Activity3) _activity3 = false;
  }
  static public Singleton getInstance() {
    if (_activity1 && _activitiy2 && _activity3) {
      if (_instance == null)
        _instance = new Singleton();
      return _instance;
    }
    return null;
  }
}

class Activity1 {
  @Overrride
  public void onCreateView() {
    Singleton.register(this);
  }
  @Override
  public void onDestroy() {
    Singleton.unregister(this);
}

同样适用于Activity2和3。以上只是伪代码。

【讨论】:

    【解决方案2】:

    在设计您的应用时,您应该尽可能避免创建此类共享状态。但如果你真的需要它 - 见下文。

    你可以创建一个带有“引用计数”的单例 - Self releasing (reference counting) singelton

    如果您想限制其可见性,您可以将其设为私有包(例如,如果您的活动在同一个包中)。

    但这整件事在我看来有点过于复杂,我可能会使用普通的单例或 Application 类中的一个字段,如果我知道某个时候不再需要它,可能会手动删除它。

    【讨论】:

      【解决方案3】:

      如果您的对象可以序列化,也许您可​​以尝试使用SharedPreferences 来存储您的特定对象,使用here 描述的方法之一。然后,您可以从任何活动中解析和修改它。

      如果您希望它仅在所有三个活动都运行时保持不变,只需清除您的 SharedPreferences 条目。

      【讨论】:

        【解决方案4】:

        您好@rahul,您可以在您的对象中实现 parcelable 并通过 Intent 将其传递给所有活动。通过这种方式,您可以保持状态并避免单例。

        由于创建对象parcelable 涉及更多样板代码,您可以使用不需要样板代码的parceler 库。 使对象可打包后,您可以像这样通过 Intent 将其传递给任何活动

        Intent intent = new Intent(this, MyActivity.class);
        intent.putParcelable("key", object_you_want_to_pass);
        ...
        startActivity(intent);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-10-07
          • 2012-07-22
          • 2011-01-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-28
          相关资源
          最近更新 更多