应用程序重启后如何记住分数?

时间:2017-12-29 21:37:33

标签: java android android-intent sharedpreferences

我正在制作一个双人游戏,我可以进行复赛。我也跟踪每个球员的得分。这就是我的复赛代码:

public void rematch(View view) {
    Intent i = getBaseContext().getPackageManager()
            .getLaunchIntentForPackage( getBaseContext().getPackageName() );

    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    finish();
    startActivity(i);

}

当用户单击重新匹配按钮时,将调用上述代码。我基本上只是重新启动应用程序,因为它比重置我拥有的所有变量更容易。无论如何,为了跟踪分数,我正在覆盖onStop()这样的方法:

@Override
protected  void onStop() {
    super.onStop();

    // We need an Editor object to make preference changes.
    // All objects are from android.context.Context
    SharedPreferences settings = getSharedPreferences(SCORES_NAME, 0);
    SharedPreferences.Editor editor = settings.edit();

    editor.putInt("scoreOne", p1Score);
    editor.putInt("scoreTwo", p2Score);

    editor.commit();
}

我正在使用共享偏好设置。然后,在我的onCreate方法中,我得到这样的共享首选项:

// Remember scores from previous games
    SharedPreferences settings = getSharedPreferences(SCORES_NAME, 0);
    p1Score = settings.getInt("scoreOne", 0);
    p2Score = settings.getInt("scoreTwo", 0);
    updateScores();

SCORES_NAME是     public static final String SCORES_NAME = "MyScores";

这一切都行不通。我在游戏重启后的分数总是回到0.我在考虑在rematch()中添加额外内容,但我不确定如何在我的onCreate()方法中访问此意图。非常感谢任何帮助!

3 个答案:

答案 0 :(得分:0)

您需要覆盖onSaveInstanceState(Bundle savedInstanceState)并将要更改的应用程序状态值写入Bundle参数,如下所示:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
  super.onSaveInstanceState(savedInstanceState);
  // Save UI state changes to the savedInstanceState.
  // This bundle will be passed to onCreate if the process is
  // killed and restarted.
  savedInstanceState.putInt("scoreOne", p1Score);
  savedInstanceState.putInt("scoreTwo", p2Score);

  // etc.
}

Bundle本质上是一种存储NVP(“名称 - 值对”)地图的方式,它将被传递到onCreate()以及onRestoreInstanceState(),您可以在其中提取值这样:

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
  super.onRestoreInstanceState(savedInstanceState);
  // Restore UI state from the savedInstanceState.
  // This bundle has also been passed to onCreate.
  int p1Score = settings.getInt("scoreOne", 0);
    int p2Score = settings.getInt("scoreTwo", 0);
}

您通常会使用此技术来存储应用程序的实例值(选择,未保存的文本等)。

答案 1 :(得分:0)

问题在于您假设在第一个活动onCreate()完成执行后将调用新活动的onStop()

这可能不是你想做的假设,因为它们是两个不完全相关的东西。

将您需要的值发送到意图

中新创建的活动
public void rematch(View view) {
    Intent i = getBaseContext().getPackageManager()
            .getLaunchIntentForPackage( getBaseContext().getPackageName() );

    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    // Those next values will be there for sure in the new activity.
    i.putExtra("scoreOne", p1Score);
    i.putExtra("scoreTwo", p2Score);
    finish();
    startActivity(i);
}

Activity的onCreate中,可以按如下方式提取这些值

public void onCreate(Bundle savedInstance) {
    super.onCreate();
    ..

    int p1Score = getIntent().getIntExtra("scoreOne", 0);
    int p2Score = getIntent().getIntExtra("scoreTwo", 0);
}

答案 2 :(得分:0)

您需要从onStop获取代码并在从finish()方法调用rematch之前执行该代码。像这样:

private void saveScores() {
    SharedPreferences settings = getSharedPreferences(SCORES_NAME, 0);
    SharedPreferences.Editor editor = settings.edit();

    editor.putInt("scoreOne", p1Score);
    editor.putInt("scoreTwo", p2Score);

    editor.commit();
}

然后从rematch

调用此函数
(...)
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

saveScores();

finish();
startActivity(i);

然而,@ elmorabea的解决方案更好的是你现在只使用SharedPreferences在活动之间传递值。