繁体   English   中英

应用重启后如何记分?

[英]How to remember score after app has been restarted?

我正在做一个两人游戏,我可以重新比赛。 我也在跟踪每个玩家的分数。 这是我的重赛代码如下所示:

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_NAMEpublic static final String SCORES_NAME = "MyScores";

这一切都不起作用。 我在游戏重新开始后的得分总是回到0。我正在考虑在rematch()的意图中添加额外内容,但是我不确定如何在我的onCreate()方法中访问此意图。 任何帮助是极大的赞赏!

您需要重写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);
}

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

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

这可能不是您要做出的假设,因为它们是两个不完全相关的事物。

将您需要的值发送到意图中的新创建的活动

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

您需要从onStop获取代码并执行代码,然后再从rematch方法调用finish() 像这样:

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在活动之间传递值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM