从 onRestart 状态返回时如何在应用程序中继续计时器

how to continue timer in app when come back from onRestart state

我创建了一个记忆游戏的小应用程序。在该应用程序中,我创建了一个计时器,显示用户完成游戏所需的时间。我的问题是,在我转到另一个页面(如主屏幕)并返回游戏后,计时器冻结了——时间保持在停止的同时……(我知道它与 onRestarte() 方法有某种关系但不知道该怎么做..)我希望计时器在停止的同时继续。 (比如如果用户在游戏中途接到电话然后想继续)。

    package com.example.kineret.memorygame;



    public class Game4x4Activity extends AppCompatActivity implements     View.OnClickListener{

    TextView timerTextView;
    long startTime = 0;
    Handler timerHandler = new Handler();
    Runnable timerRunnable = new Runnable() {
        @Override
        public void run() {
            long millis = System.currentTimeMillis() - startTime;
            int seconds = (int) (millis / 1000);
            int minutes = seconds / 60;
            seconds = seconds % 60;

            timerTextView.setText(String.format("%d:%02d", minutes, seconds));
            timerHandler.postDelayed(this, 500);
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_game4x4);
        timerTextView = (TextView) findViewById(R.id.timerTextView4x4);
    }

    @Override
    public void onPause() {
        super.onPause();
        timerHandler.removeCallbacks(timerRunnable);
    }


    @Override
    public void onClick(View view) {

        if(newGame) {
            startTime = System.currentTimeMillis();
            timerHandler.postDelayed(timerRunnable, 0);
            newGame = false;
        }

        // rest of my code...

}

如果用户接到 phone 电话,您的应用将调用 onPause,然后如果他们完成 phone 电话并玩您的游戏,您的 activity 将收到 onResume 叫了。

onPause保存系统时间,在onResume获取最新的系统时间。将它们彼此分开(在 onResume 中),您将获得用户不在您的应用中的时间,然后您可以在重新启动它之前将其添加到您的计时器中。

这次你可能还得坚持 onSaveInstanceState 在其他时候。

我已经编辑了你的代码。请试试这个

public class Game4x4Activity extends AppCompatActivity implements     View.OnClickListener{

    // make a new variable
    static long elapsedTime = 0;
    TextView timerTextView;
    long startTime = 0;
    Handler timerHandler = new Handler();
    Runnable timerRunnable = new Runnable() {
        @Override
        public void run() {
            // change here
            long millis = (System.currentTimeMillis() - startTime) + elapsedTime;
            int seconds = (int) (millis / 1000);
            int minutes = seconds / 60;
            seconds = seconds % 60;

            timerTextView.setText(String.format("%d:%02d", minutes, seconds));
            timerHandler.postDelayed(this, 500);
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_game4x4);
        timerTextView = (TextView) findViewById(R.id.timerTextView4x4);
    }

    @Override
    public void onPause() {
        // change here
        elapsedTime = elapsedTime + (System.currentTimeMillis() - startTime);
        timerHandler.removeCallbacks(timerRunnable);
        super.onPause();
    }

    @Override
    public void onResume() {
        super.onResume();
        // change here
        if(!newGame) {
            startTime = System.currentTimeMillis();
            timerHandler.postDelayed(timerRunnable, 0);
        }
    }