重新启动活动时保存int值

时间:2012-06-30 15:57:28

标签: java android persistent-storage

我是新人,我知道我会因为这个问题而受到打击,但如果我得到答案,那将是值得的。我有一个游戏,当用户赢得第一轮时,我希望保存得分并重新启动活动,而不是遍历所有代码并重置每个值。现在,如何在活动重新启动时保持分数不会重置。我还没有例子。

 public class MainActivity extends Activity implements OnClickListener {
/** Called when the activity is first created. */
// SET UP SPINS
private TextView spins;
private Button spin;

// SET UP CONTROLS
private TextView score;
private ProgressBar progressBar;
private static final int SHOW_BONUSACTIVITY = 1;
    int nextspin = 0;
int alert;
int total = 0;
int totalspins = 14;
public int gamescore = 0;
public int currentgamescore = 0;

   @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.play_layout);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

这是我第一次检查是否有新游戏或者是否保存了高分的地方

if (GameState.INSTANCE.getScore() != 0){
        gamescore = GameState.INSTANCE.getScore();}

如果用户赢了,那么他们就会获得奖金游戏,如果他们已经完成游戏并且需要开始新游戏那么就会看到

   @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
    case (SHOW_BONUSACTIVITY): {
        if (resultCode == Activity.RESULT_OK) {
            int bonus = data.getIntExtra("money", 0);
            gamescore=(gamescore + bonus);
            score.setText(String.valueOf("SCORE: " + gamescore));
            if (bigwin == true){

在这里,我保存了游乐场,如果它们处于第一级,我将把它带入新的活动。

                GameState.INSTANCE.addScore(gamescore);
                Intent intent = new Intent(
                MainActivity.this,
                com.bigdaddyapp.android.blingo.MainActivity.class);
                startActivity(intent);  


            }
            }
        }
    }
    }

下一个代码是枚举活动

public enum GameState {
INSTANCE;

  private int score;
  private GameState(){
    score = 0;
  }

  public int getScore(){
    return score;
  }
  public void addScore(int score){
    this.score += score;
  }

}

3 个答案:

答案 0 :(得分:3)

您可以使用SharedPreferences作为一种简单的持久存储机制来保存分数,生命等等。当关卡结束时,通过putInt()保存分数,当您想获得分数时使用getInt()

答案 1 :(得分:2)

作为存储值持久性的替代方法(使用“共享首选项”或“SQLite数据库”),您还可以将值存储在内存中,但存储在更全局的上下文中。通过这种方式,您可以在重新创建活动时保持状态,但应用程序在关闭时会忘记它们。

这可能不是您特定情况所需要的,但有时候这是更好的选择。


使用Singleton ,您可以更全面地存储应用程序的状态,并在代码中的任何位置检索它。一个例子可能是:

public enum GameState{
  INSTANCE;

  private int score;
  private GameState(){
    score = 0;
  }

  public int getScore(){
    return score;
  }
  public void addScore(int score){
    this.score += score;
  }

}

只需写一下即可使用:

GameState.INSTANCE.addScore(20);
GameState.INSTANCE.getScore();

有多种方法可以实现单例。在我的例子中,我使用了Joshua Bloch在他的书“Effective Java - Second Edition”中记录的方法。 See wikipedia了解更多信息。


扩展android.app.Application 是另一种选择,不像使用单身人士那样推荐。来自the JavaDoc

  

需要维护全局应用程序状态的基类。   您可以通过在您的名称中指定其名称来提供自己的实现   AndroidManifest.xml的标记,这将导致该类   在你的过程中为你实例化   应用程序/包已创建。

可能会找到有关如何执行此操作的教程here(以及linked answer)。

答案 2 :(得分:0)

当你想结束游戏时,请执行以下操作:

  SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
  SharedPreferences.Editor editor = settings.edit();
  editor.putInt("gamevariable", gamevariable);

  editor.commit();

然后在你的onCreate方法中,取回你的变量并按你的意愿使用它:

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
myvariable = settings.getInt("gamevariable", false);

作为替代方案,我会使用标准序列化,这是一个更复杂但更容易的选择。

首先将您的整数写入.ser文件,稍后您可以将其读取并保存到项目目录中:

OutputStream os = new FileOutputStream("myinteger.ser");
ObjectOutput oo = new ObjectOutputStream(os);
oo.writeObject(myinteger);
oo.close();

然后在下次加载活动时将整数读回变量:

InputStream is = new FileInputStream("myinteger.ser");
ObjectInput oi = new ObjectInputStream(is);
int myinteger = (int) oi.readObject();
oi.close();