Pause CountDownTimer in Android when activity is not in front Pause CountDownTimer in Android when activity is not in front android android

Pause CountDownTimer in Android when activity is not in front


I would add something to the onTick handler to save the progress of the timer in your class (number of milliseconds left).

In the onPause() method for the activity call cancel() on the timer.

In the onResume() method for the activity create a new timer with the saved number of milliseconds left.


You can use pause() to pause the timer and later on Start or Resume the countDownTimer by calling start().

/** * This class uses the native CountDownTimer to  * create a timer which could be paused and then * started again from the previous point. You can  * provide implementation for onTick() and onFinish() * then use it in your projects. */public abstract class CountDownTimerPausable {    long millisInFuture = 0;    long countDownInterval = 0;    long millisRemaining =  0;    CountDownTimer countDownTimer = null;    boolean isPaused = true;    public CountDownTimerPausable(long millisInFuture, long countDownInterval) {        super();        this.millisInFuture = millisInFuture;        this.countDownInterval = countDownInterval;        this.millisRemaining = this.millisInFuture;    }    private void createCountDownTimer(){        countDownTimer = new CountDownTimer(millisRemaining,countDownInterval) {            @Override            public void onTick(long millisUntilFinished) {                millisRemaining = millisUntilFinished;                CountDownTimerPausable.this.onTick(millisUntilFinished);            }            @Override            public void onFinish() {                CountDownTimerPausable.this.onFinish();            }        };    }    /**     * Callback fired on regular interval.     *      * @param millisUntilFinished The amount of time until finished.      */    public abstract void onTick(long millisUntilFinished);    /**     * Callback fired when the time is up.      */    public abstract void onFinish();    /**     * Cancel the countdown.     */    public final void cancel(){        if(countDownTimer!=null){            countDownTimer.cancel();        }        this.millisRemaining = 0;    }    /**     * Start or Resume the countdown.      * @return CountDownTimerPausable current instance     */    public synchronized final CountDownTimerPausable start(){        if(isPaused){            createCountDownTimer();            countDownTimer.start();            isPaused = false;        }        return this;    }    /**     * Pauses the CountDownTimerPausable, so it could be resumed(start)     * later from the same point where it was paused.     */    public void pause()throws IllegalStateException{        if(isPaused==false){            countDownTimer.cancel();        } else{            throw new IllegalStateException("CountDownTimerPausable is already in pause state, start counter before pausing it.");        }        isPaused = true;    }    public boolean isPaused() {        return isPaused;    }}


No need to create a new Timer, just set the millisUntilFinished = total. For instance

private CountDownTimer cdTimer;private long total = 30000;        ...        toggleButton.setOnClickListener(new View.OnClickListener() {            public void onClick(View view){                if(toggleButton.isChecked()) {                    startCountDownTimer();                }else{                    cdTimer.cancel();                }            }        });        ...    private void startCountDownTimer() {        cdTimer = new CountDownTimer(total, 1000) {            public void onTick(long millisUntilFinished) {                //update total with the remaining time left                total = millisUntilFinished;                nTimeLabel.setText("seconds remaining: " +  millisUntilFinished/ 1000);            }            public void onFinish() {                nTimeLabel.setText("done!");            }        }.start();    }