我的问题是我的两个活动GameActivity
和StoreActivity
应该共享相同的Player
,并且在任何Activity
中所做的Player
的每个变化都应该在所有活动中看到,但是当我在StoreActivity
中购买Upgrade
并从StoreActivity
更改时,对象的状态是从购买前开始的。Player
Serializable
.
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);