如何在安卓的整个活动之间访问一个对象?



我的问题是我的两个活动GameActivityStoreActivity应该共享相同的Player,并且在任何Activity中所做的Player的每个变化都应该在所有活动中看到,但是当我在StoreActivity中购买Upgrade并从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?
}
}
});

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

当活动重新与用户交互时,将调用它。

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

您可以像这样实现它:

public class GameActivity extends AppCompatActivity {
@Override
protected void onResume() {
super.onResume();
//refreshing changed list items
}
}

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

这篇很棒的 Codepath 文章解释了如何做到这一点。

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

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,而没有任何生命周期来重新呈现它,则可以在回调中创建更新侦听器。

您可以使用单例设计模式。

您从带有播放器字段的PlayerRepository创建一个对象,在您的应用程序中,您每次都能获得它 你想要你改变它。

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;
}
}

在您的活动中

PlayerRepository playerRepository=PlayerRepository.getInstance();
Player player=playerRepository.getPlayer();
player.buyUpgrade(upgrade);

最新更新