Intereting Posts
Не удалось синхронизировать Gradle для Android Studio 3.0: java.lang.AssertionError (в UnresolvedDependenciesReporter) Не удалось запустить приложение Android в Eclipse; Внутренняя ошибка произошла во время: «Запуск myApp» Где дополнительные параметры командной строки в Android Studio версии 1.5.1 для эмулятора Как избежать показ уже разрешенного к диалогу приложения в Android Facebook SDK Android: изменить цвет отключенного текста с помощью темы / стиля? Android: как получить статус-код запроса HttpClient Дизайн макета Android Можно ли добавить массив или объект в SharedPreferences на Android? Слушатели событий window.open не работают в Android 4.4.2 КоординаторLayout + TabView + AnimateView (сверху) Виджеты, настроенные с помощью android: configure будут получать onUpdate, даже если конфигурация не завершена Android – соответствует шаблону url? Android push-сообщение без gcm возможно? Как преобразовать файл WAV / OGG в файл FLAC в Android? Android: Как установить уровень масштабирования вида карты в радиусе 1 км вокруг моего текущего местоположения?

Пауза CountDownTimer в Android, когда активность не впереди

У меня есть действие, которое использует CountDownTimer, который отсчитывает от 10. Как приостановить этот таймер, когда действие больше не находится в фокусе, например, если пользователь получил вызов или что-то еще, затем возобновите таймер, когда пользователь вернется к Мероприятия? Возможно ли это?

Solutions Collecting From Web of "Пауза CountDownTimer в Android, когда активность не впереди"

Я бы добавил что-то к обработчику onTick, чтобы сохранить ход таймера в вашем классе (количество оставшихся миллисекунд).

В методе onPause () для отмены вызова активности () на таймере.

В методе onResume () для активности создайте новый таймер с сохраненным количеством миллисекунд слева.

Вы можете использовать pause() чтобы приостановить таймер, а затем запустить или возобновить countDownTimer, вызвав 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; } } 

Нет необходимости создавать новый таймер, просто установите значение millisUntilFinished = total. Например

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

Это должно быть именно то, что вы ищете. Источник – это суть.

 package alt.android.os; import android.os.Handler; import android.os.SystemClock; import android.os.Message; public abstract class CountDownTimer { /** * Millis since epoch when alarm should stop. */ private final long mMillisInFuture; /** * The interval in millis that the user receives callbacks */ private final long mCountdownInterval; private long mStopTimeInFuture; private long mPauseTime; private boolean mCancelled = false; private boolean mPaused = false; /** * @param millisInFuture The number of millis in the future from the call * to {@link #start()} until the countdown is done and {@link #onFinish()} * is called. * @param countDownInterval The interval along the way to receive * {@link #onTick(long)} callbacks. */ public CountDownTimer(long millisInFuture, long countDownInterval) { mMillisInFuture = millisInFuture; mCountdownInterval = countDownInterval; } /** * Cancel the countdown. * * Do not call it from inside CountDownTimer threads */ public final void cancel() { mHandler.removeMessages(MSG); mCancelled = true; } /** * Start the countdown. */ public synchronized final CountDownTimer start() { if (mMillisInFuture <= 0) { onFinish(); return this; } mStopTimeInFuture = SystemClock.elapsedRealtime() + mMillisInFuture; mHandler.sendMessage(mHandler.obtainMessage(MSG)); mCancelled = false; mPaused = false; return this; } /** * Pause the countdown. */ public long pause() { mPauseTime = mStopTimeInFuture - SystemClock.elapsedRealtime(); mPaused = true; return mPauseTime; } /** * Resume the countdown. */ public long resume() { mStopTimeInFuture = mPauseTime + SystemClock.elapsedRealtime(); mPaused = false; mHandler.sendMessage(mHandler.obtainMessage(MSG)); return mPauseTime; } /** * 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(); private static final int MSG = 1; // handles counting down private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { synchronized (CountDownTimer.this) { if (!mPaused) { final long millisLeft = mStopTimeInFuture - SystemClock.elapsedRealtime(); if (millisLeft <= 0) { onFinish(); } else if (millisLeft < mCountdownInterval) { // no tick, just delay until done sendMessageDelayed(obtainMessage(MSG), millisLeft); } else { long lastTickStart = SystemClock.elapsedRealtime(); onTick(millisLeft); // take into account user's onTick taking time to execute long delay = lastTickStart + mCountdownInterval - SystemClock.elapsedRealtime(); // special case: user's onTick took more than interval to // complete, skip to next interval while (delay < 0) delay += mCountdownInterval; if (!mCancelled) { sendMessageDelayed(obtainMessage(MSG), delay); } } } } } }; }