OnPause / onResume

У меня есть небольшое тестовое приложение, над которым я работаю, у которого есть таймер, который обновляет текстовое изображение до обратного отсчета от 100 до 0. Это работает отлично, но теперь я пытаюсь приостановить приложение, если пользователь нажимает кнопку «Назад» на телефоне, а затем Перезапустите таймер с того места, где они остановились при повторном открытии приложения. Вот код, который я использую:

@Override public void onPause() { if(this._timer_time_remaining > 0) { this.timer.cancel(); } super.onPause(); Log.v("Pausing", String.format("Pausing with %d", this._timer_time_remaining)); } @Override public void onResume() { Log.v("Resuming", String.format("Resuming with %d", this._timer_time_remaining)); if(this._timer_time_remaining > 0) { start_timer(this._timer_time_remaining); } super.onResume(); } 

Метод start_timer () создает CountDownTimer, который обновляет текстовое представление в методе onTick и обновляет переменную int._timer_time_remaining int.

CountDownTimer и _timer_time_remaining объявляются на уровне класса следующим образом:

 private CountDownTimer timer; private int _timer_time_remaining; 

Из распечаток Log.v () я вижу, что переменная _timer_time_remaining имеет правильное количество секунд, сохраненных при вызове onPause, но она возвращается к 0, когда начинается onResume. Почему переменная получает сброс? Я думал, что приложение будет продолжать работать в фоновом режиме с одинаковыми значениями. Я что-то упускаю? Это все объявлено в классе, который расширяет Activity.

Заранее спасибо!

Примечание. Отредактировано для очистки копирования кода

Если вы посмотрите на диаграмму жизненного цикла Activity, вы поймете, что нет никаких гарантий относительно вас. Активность после вызова onPause. Android может убить вас. Активность, даже не вызывающая onDestroy. Вы должны сохранить свое состояние с помощью onSaveInstanceState и восстановить его с помощью onRestoreInstanceState .

Это может быть полезно.

РЕДАКТИРОВАТЬ:

Жизненный цикл охватывает различные сценарии. Если у вас есть только одно действие, нажатие Назад эквивалентно выходу из вашего приложения. Если у вас есть Activity A, который запускает действие B, то onSaveInstanceState вызывается для Activity A. Когда вы нажмете обратно в Activity B, он просто выйдет, и onRestoreInstanceState вызывается для Activity A. Вы пытаетесь сохранить данные между двумя разными запусками вашего приложения, а вы Для этого нужно использовать какое-то постоянное хранилище .

Вот как я бы сохранил значение: (Четыре строки кода)

 SharedPreferences example = getSharedPreferences("example", MODE_PRIVATE); SharedPreferences.Editor edit = example.edit(); edit.putInt("time_remaining", (Integer)this._timer_time_remaining); edit.commit(); 

В резюме выполните следующие действия: (Две строки кода)

 SharedPreferences example = getSharedPreferences("example", MODE_PRIVATE); int time_remaining = example.getInt("time_remaining", 0); 

Я адаптировал это из своего рабочего кода, но на самом деле не тестировал его в этом точном формате. Поиск документации для sharedPreferences, чтобы узнать, как она работает.

Я не эксперт по Android, а просто говорю, как я ожидаю, что таймер будет вести себя

this.timer.cancel() : – отменит таймер, но не приостанавливает его

start_timer(this._timer_time_remaining) : – будет «перезапускать» таймер, а не продолжать с последней позиции.

Итак, что вы видите правильно. Каждый раз, когда время запускается заново. Узнайте, что такое api, чтобы приостановить таймер (если есть).

Вы можете просто написать время в базу данных или файл в onPause и прочитать его обратно в onResume.

Вы также можете прослушать нажатия клавиш (onKeyDown ()), чтобы перехватить кнопку «Назад» и сохранить данные в таблице SQLite.

Intereting Posts