簡體   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