Search code examples
androidcountercountdowntimer

Save Countdowntimer on activity destroy and resume it in onResume()


I want to start a counter for 2 minute and when activity destroy then i want to save that and on activity resume i want to start the counter where i left

counter = new CountDownTimer(120000, 1000) { // adjust the milli seconds here

        public void onTick(long millisUntilFinished)
        {
            textview.setText("" + String.format("%d min, %d sec",
                    TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished),
                    TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) -
                            TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished))));

            Log.i(TAG, "onTick: "+millisUntilFinished);
        }

        public void onFinish()
        {
            textview.setText("done!");
        }
    }.start();

Solution

  • We just save a value of millisUntilFinished when activity is destroy and create new CountDownTimer with that value when activity start again.

    long millisUntilFinished;
    

    in onDestroy() (or onStop())

    @Override
        public void onDestroy() {
            SharedPreferences.Editor editor = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE).edit();
            editor.putLong("millisUntilFinished", millisUntilFinished);
            editor.apply();
            super.onDestroy();
        }
    

    and get value of millisUntilFinished when you want to start the CountDownTimer

            SharedPreferences prefs = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE);
            millisUntilFinished = prefs.getLong("millisUntilFinished", 120000);
    
            counter = new CountDownTimer(millisUntilFinished, 1000) { // adjust the milli seconds here
    
                public void onTick(long millisUntilFinished) {
                    this.millisUntilFinished = millisUntilFinished;
                    textview.setText("" + String.format("%d min, %d sec",
                            TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished),
                            TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished)
                                    - TimeUnit.MINUTES.toSeconds(
                                    TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished))));
    
                    Log.i(TAG, "onTick: " + millisUntilFinished);
                }
    
                public void onFinish() {
                    textview.setText("done!");
                }
            }.start();