Java 重新启动活动时保存int值

Java 重新启动活动时保存int值,java,android,persistent-storage,Java,Android,Persistent Storage,我是新来的,我知道我会因为这个问题被击败,但如果我得到答案,那是值得的。我有一个游戏,当用户赢得第一轮时,我希望保存分数并重新启动活动,而不是遍历所有代码并重置每个值。现在,如何在活动重新启动时防止分数重置。到目前为止,我还没有例子 public class MainActivity extends Activity implements OnClickListener { /** Called when the activity is first created. */ // SET UP

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

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

}

您可以作为一个简单的持久存储机制来保存分数、生命等。当级别结束时,通过和当您想要使用分数时保存分数。

您可以作为一个简单的持久存储机制来保存分数、生命等。当级别结束时,当您希望获得分数时,通过和保存分数。

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

这可能不是您特定案例所需要的,但有时是更好的选择


使用单例,您可以更全局地存储应用程序的状态,并在代码中的任何位置检索它。例如:

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在其著作《有效Java-第二版》中记录的方法。了解更多信息


扩展
android.app.Application
是另一种选择,被认为不如使用singleton推荐。发件人:

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


可以找到关于如何执行此操作的教程(以及)。

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

这可能不是您特定案例所需要的,但有时是更好的选择


使用单例,您可以更全局地存储应用程序的状态,并在代码中的任何位置检索它。例如:

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在其著作《有效Java-第二版》中记录的方法。了解更多信息


扩展
android.app.Application
是另一种选择,被认为不如使用singleton推荐。发件人:

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


可能会找到关于如何完成此操作的教程(以及)。

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

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

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

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

删除了活动标签,添加了持久存储标签。哇!感谢您的输入,我将全部试用,然后回来检查适合我使用的最佳答案。删除活动标签,添加持久存储标签。哇!谢谢你的输入,我会全部尝试,然后回来检查适合我使用的最佳答案。很好,我现在就试试,然后再给你回复。谢谢。好吧,我想我的问题没那么糟糕没有人给我一个新的,但我能得到1吗?很好,我现在就试试,然后再给你回复。谢谢。好吧,我想我的问题没那么糟糕,没有人给我一个新的,但我能得到一个1吗?卢卡斯,你能再看看这个,告诉我哪里出了问题吗?当我打电话给mainActivity重新启动时,分数从0开始,我失去了我想要重新启动新游戏的游戏分数。我真的很抱歉这是我的错误。我的代码就在下面,当我删除时,我没有显示将gamescore的值设置为=0的代码,它的工作方式与您所说的一样。谢谢,上面的示例中添加了正确的代码。@sai否,如回答中所述。只要应用程序在运行(在后台或前台),这将继续存在,但当应用程序关闭(所有活动都已完成)时,这将被遗忘。@sai请看我下面Raghav Sood的回答。Lukas,你能看看这个吗