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

时间:2017-01-01 20:57:22

标签: android timer handler runnable activity-lifecycle

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

    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...

}

2 个答案:

答案 0 :(得分:0)

如果用户接到电话,您的应用会拨打onPause,如果他们完成了通话并玩游戏,您的活动就会被onResume调用。

onPause中保存系统时间,在onResume中获取最新的系统时间。将这些文件相互分开(在onResume中),您将有时间不在用户的应用程序中,然后可以在重新启动之前将其添加到计时器中。

您可能还需要在其他时间点onSaveInstanceState坚持这段时间。

答案 1 :(得分:0)

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

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