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 и обновляет переменную this._timer_time_remaining int.
CountDownTimer и _timer_time_remaining объявляются на уровне класса следующим образом:
private CountDownTimer timer;
private int _timer_time_remaining;
Из распечаток Log.v() я вижу, что переменная _timer_time_remaining имеет правильное количество секунд, хранящихся при вызове onPause, но она возвращается к 0 при запуске onResume. Почему переменная получает reset? Я думал, что приложение будет продолжать работать в фоновом режиме с теми же значениями. Я что-то упускаю? Это все объявлено в классе, который расширяет Activity.
Спасибо заранее!
Примечание. Отредактировано для очистки копирования кода.
Ответы
Ответ 1
Если вы посмотрите на диаграмму для жизненный цикл активности, вы поймете, что нет никаких гарантий относительно вас. Активность после вызова onPause, Android может убить вас. Активность, даже не вызывающая onDestroy. Вы должны сохранить свое состояние, используя onSaveInstanceState и восстановить его с помощью onRestoreInstanceState.
Это может быть полезно.
EDIT:
Жизненный цикл охватывает различные сценарии. Если у вас есть только одно действие, нажатие Назад эквивалентно выходу из вашего приложения. Если у вас есть Activity A, который запускает активность B, то onSaveInstanceState вызывается для Activity A. Когда вы нажмете обратно в Activity B, он просто выйдет, и onRestoreInstanceState вызывается для Activity A. Вы пытаетесь сохранить данные между двумя разными запусками вашего приложения, и вы необходимо использовать для этого постоянное хранилище.
Ответ 2
Вот как я бы сохранил значение: (Четыре строки кода)
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, чтобы узнать, как она работает.
Ответ 3
Я не эксперт по Android, а просто говорю, как я ожидаю, что таймер будет вести себя
this.timer.cancel()
: - отменит таймер, но не приостановит его
start_timer(this._timer_time_remaining)
: - будет "перезапускать" таймер, а не продолжать с последней позиции.
Итак, что вы видите, правильно. Каждый раз, когда время запускается заново.
Узнайте, что такое api, чтобы приостановить таймер (если есть).
Ответ 4
Вы можете просто написать время в базу данных или файл в onPause и прочитать его обратно в onResume.
Ответ 5
Вы также можете попробовать прослушивать нажатия клавиш (onKeyDown()), чтобы перехватить кнопку "Назад" и сохранить данные в таблице SQLite.