Search code examples
androidtimerhandlerrunnableactivity-lifecycle

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


i've created a small app of memory game. in that app i have created a timer that show the time that take the user to finish the game. my problem is that the timer freeze after i go to another page (like home screen) and back to the game- the time remain at the same time it was stopped.....(i khnow it related somehow to onRestarte() method but dont know what to do..) i want that the timer will continue at the same time it has been stopped. (like if the user have an incall in the middle of the game and then want to continue).

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

}

Solution

  • i have edited your code. plz try this

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