onPause / onResume проблемы с активностью - PullRequest
14 голосов
/ 14 марта 2010

У меня есть небольшое тестовое приложение, над которым я работаю и которое имеет таймер, который обновляет текстовое представление до обратного отсчета от 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, но при запуске onResume оно устанавливается равным 0. Почему переменная сбрасывается? Я думал, что приложение будет продолжать работать в фоновом режиме с теми же значениями. Я что-то пропустил? Все это объявлено в классе, который расширяет Activity.

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

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

Ответы [ 5 ]

16 голосов
/ 14 марта 2010

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

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

EDIT:

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

2 голосов
/ 16 апреля 2012

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

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, чтобы узнать, как это работает.

1 голос
/ 14 января 2012

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

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

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

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

0 голосов
/ 18 марта 2012

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

0 голосов
/ 02 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...