Android应用程序在恢复后丢失/改变状态

时间:2013-01-11 01:02:34

标签: android lifecycle

我是android开发的初学者,所以请耐心等待。

这是我写一篇简单的“Whack-a-Mole”游戏的悲惨尝试。用户界面由9个按钮组成,没有标题。计时器随机选择一个必须由用户点击的按钮(按钮获得标题“X”)。如果用户选择了正确的按钮,他将获得10分。如果没有及时点击按钮(或错误按钮),将从分数中减去10个点。

正如您所看到的,我在每个按钮上添加了一个OnClickListener,并在onCreate-Method中删除了其初始标题(“Button1”,“Button2”...)。一切看起来都很好,直到我离开应用程序然后回到它。所有按钮突然再次显示其初始标题。计时器仍然运行(分数每秒减少)但没有一个按钮改变了。

现在我知道这可能与活动生命周期有关,我已经读过它了。不幸的是,我的英语不是最好的,我在理解这个概念时遇到了一些麻烦。也许有人愿意用简单的语言向我解释这个问题?

public class MainActivity extends Activity {

private static int[]        buttons     = {R.id.button1, R.id.button2, ...};
private static List<Button> buttonlist  = new ArrayList<Button>();

private static TextView     scoreboard;
private static Timer        timer = new Timer();
private static int          score;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    scoreboard = (TextView) findViewById(R.id.textView1);

    for (int i = 0; i < 9; i++) {
        buttonlist.add((Button) findViewById(buttons[i]));
        buttonlist.get(i).setText("");

        // add OnClickListener for each Button
        ((Button) buttonlist.get(i)).setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                //if correct Button is pressed add 20 to score 
                if ("X".equals(((Button) v).getText().toString())) {
                    score += 20;
                    //and set button-text to "" again ...
                    ((Button) v).setText("");
                }
                else {
                    score -= 10;
                }
            }
        });

    }
    // Start Game
    timer.schedule(new MyTimerTask(), 0, 1000);
}

private class MyTimerTask extends TimerTask {
    @Override
    public void run() {
        runOnUiThread(new Runnable() {
            public void run() {
                score -= 10;
                scoreboard.setText("Your Score: " + score);

                //clear buttons
                for (int i = 0; i < 9; i++)
                    buttonlist.get(i).setText("");

                //pick random button as next target
                buttonlist.get((int) (Math.random() * (9 - 1) + 1)).setText("X");
            }
        });
    }
}



@Override
protected void onResume() {
    super.onResume();
    // Do something here?
}


...

1 个答案:

答案 0 :(得分:1)

离开活动后,系统会在您的活动中调用以下方法:

的onPause 的onStop 的onDestroy

您的活动类实例将被销毁

再次输入活动时,将再次创建活动,将调用以下方法:

的onCreate 在onStart 的onResume

这就是您的案例中活动生命周期的样子(还有更多细节)

你的问题是你的buttonList是静态的,还有计时器和分数。即使您离开应用程序,系统也不会破坏您的应用程序进程,这样所有静态变量都将保持不变。这意味着您的按钮列表将包含来自先前活动实例的初始按钮。

解决方案是不使用static关键字。如果要在退出活动后保留某些状态,请查看onSaveInstanceState。此外 - 假设您的设备可以旋转,这也将重新创建您的活动。