在两个活动之间共享和更新对象

时间:2019-03-09 22:34:46

标签: android android-intent android-activity

我的问题是我的两个活动GameActivityStoreActivity应该共享相同的Player,并且应该看到在任何Player中对Activity所做的每一次更改在所有活动中,但是当我在Upgrade中购买StoreActivity并从StoreActivity更改时,对象的状态是购买前的状态。PlayerSerializable

OnClickListener来自StoreActivity

        LIST_VIEW.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Upgrade upgrade = (Upgrade)LIST_VIEW.getAdapter().getItem(position);
                if(upgrade.getCost() > player.getMoney()) {
                    LIST_VIEW.getChildAt(position).setEnabled(false);
                } else {
                    player.buyUpgrade(upgrade);
                    CURRENT_MONEY.setText(getString(R.string.current_money) + player.getMoney());
                 //Notify GameActivity, but how?
                }
            }
        });

3 个答案:

答案 0 :(得分:0)

android.app.Activity类具有一个onResume()方法。

活动返回与用户的互动时将调用它。

非常适合您的用例,因为当用户想要返回时,GameActivity将被暂停并且onResume()被调用。

您可以这样实现:

public class GameActivity extends AppCompatActivity {
        @Override
        protected void onResume() {
            super.onResume();

            //refreshing changed list items
        }
}

答案 1 :(得分:0)

您可以通过扩展Player类并将实例存储在其中来将Application对象绑定到应用程序生命周期。它将使您可以在每个活动的生命周期中对其进行引用,而不会泄漏。您可以检查它的值并显示一些负载,并在设置时创建回调,以便可以通知所有活动。

这个很棒的Codepath article解释了如何做到这一点。

您的主应用程序可能如下所示:

public class MyCustomApplication extends Application {
  private Player player;
  private ArrayList<WeakReference<OnPlayerSetCallback>> callbacks;

  public void addCallback(WeakReference<OnPlayerSetCallback> callbackRef) {
    this.callbacks.add(callbackRef);
  }

  public void removeCallback(WeakReference<OnPlayerSetCallback> callbackRef) {
    this.callback.remove(callbackRef);
  }

  public void setPlayer(Player player) {
    this.player = player;

    for (WeakReference<OnPlayerSetCallback> callbackRef : callbacks) {
      OnPlayerSetCallback callback = callbackRef.get();
      if (callback == null) {
        // remove invalid callback references (if an activity was destroyed, for example)
        callbacks.remove(callbackRef);
      } else {
        // notify activities that a player was set
        callback.onPlayerSet(player);
      }
    }
  }

  public Player getPlayer() {
    return this.player;
  }

  interface OnPlayerSetCallback {
    Player onPlayerSet();
  }
}

更新播放器应该不是问题,因为每个活动都将使用相同的实例。但是,如果您需要在没有任何生命周期的情况下更新UI的情况下,可以在回调中创建更新侦听器。

答案 2 :(得分:0)

您可以使用 Singleton 设计模式。

您可以在 PlayerRepository 中使用 player 字段创建一个对象,然后在您的应用中每次都可以获取该对象 您想更改它。

 [date* date-from id:date-from] and `[date* date-to id:date-to]`

在您的活动中

    public class PlayerRepository {

    private Player player;

    private static final PlayerRepository ourInstance = new PlayerRepository();

    public static PlayerRepository getInstance() {
        return ourInstance;
    }

    private PlayerRepository() {
    }

    public void setPlayer(Player player)
    {
        this.player=player;
    }
    public Player getPlayer()
    {
        retrun this.player;
    }
}