I'm writing a workout app and am trying to implement a rest timer in the Train activity. CountDownTimer located within Train and is called when the user presses a start button.
public CountDownTimer createTimer(long timerDuration) {
Log.d("new timer duration:", "value: " + timerDuration);
return new CountDownTimer(timerDuration, 1000) {
@Override
public void onTick(long millisUntilFinished) {
int progress = (int) (millisUntilFinished / 1000);
secondsLeftOnTimer = progress; // update variable for rest of app to access
// Update the output text
breakTimerOutput.setText(secondsToString(progress));
}
@Override
public void onFinish() { // Play a beep on timer finish
breakTimerOutput.setText(secondsToString(timerDurationSeconds));
playAlertSound(); // TODO: Fix the delay before playing beep.
}
}.start();
}
The timer works, as long as the user stays in the Train activity. If you switch to another activity, the timer continues to run in the background (the beep still occurs), which is what I want. If you go back to the Train activity, however, the breakTimerOutput TextView is no longer updated by onTick.
How can I "reconnect" breakTimerOutput to onTick when the user re-enters the Train activity?
I would like to suggest to keep the timer inside a
Serviceand useBroadcastReceiverto receive the tick to update theTextViewin yourTrainActivity.You need to start the
CountDownTimerfrom theService. So in theonCreatemethod of yourServiceyou need to initialize aLocalBroadcastManager.So on each tick on your timer (i.e.
onTickmethod), you might consider calling a function like this.Now in your
TrainActivitycreate aBroadcastReceiver.And additionally you need to register and unregister the
BroadcastReceiver.