Предотвращение воссоздания активности Android при выключении экрана

Как предотвратить воссоздание активности при выключении экрана?

Что я делаю

  • Запустите Bejewels и идите на экран ювелирных изделий.
  • Нажмите кнопку питания в ближайшее время. Экран выключен, но устройства нет.
  • Нажмите кнопку питания еще раз.

Что я вижу

Тот же экран, что и перед выключением экрана.

В случае моего приложения (тривиального, просто веб-приложения с одним WebView) сценарий следующий:

Что я делаю

  • Запустите мое приложение. Функция onCreate() загружает URL-адрес в WebView.
  • Нажмите кнопку питания в ближайшее время. Экран выключен, но устройства нет.
  • Нажмите кнопку питания еще раз.

Что я вижу

WebView перезагружает страницу.

Что я ожидал

Как и в случае с Bejewels, я хочу увидеть тот же самый экран, что для моего приложения это страница в ее предыдущем состоянии: скрипты запущены, поля формы - заполнены и т.д.

Отладка показала, что я был не прав (в предыдущем вопросе) и onDestroy() и onCreate() вызывается один за другим, когда экран только что включен. И поскольку я все еще слышу музыку, которую играет script, когда экран выключен, похоже, что активность и WebView существуют до тех пор, пока я снова не нажму кнопку питания.

Что я пробовал.

  • android: alwaysRetainTaskState = "true" То же поведение.
  • Чтение о намерениях (безрезультатно, я просто не понимал, как они применяются к моей ситуации).
  • Использование PhoneGap. Он ведет себя по-другому: просто убивает все приложение нажатием кнопки питания. Это лучше, но не самое лучшее.

Ответ 2

Решение этой проблемы может быть таким же, как описано здесь: onDestroy вызывается каждый раз, когда экран продолжается

Похоже, что ваша активность перезапускается из-за изменений конфигурации, см. http://developer.android.com/guide/topics/resources/runtime-changes.html. Наиболее распространенным является то, когда ваше приложение находится в ландшафтном режиме (например, в большинстве игр), а затем блокировка экрана задействована нажатием кнопки питания. Замок экрана находится в портретном режиме и, следовательно, вызывает изменение ориентации, которое запускает действие, которое необходимо перезапустить.

Это поведение можно переопределить, добавив:

android:configChanges="orientation|keyboardHidden"

... в файл манифеста, если вы настроите уровень API ниже 13. Или

android:configChanges="orientation|keyboardHidden|screenSize"

... если вы нацеливаете уровень API выше 13.

Обратите внимание, что вам может потребоваться перейти project- > properties и обновить цель сборки проекта. "screenSize" не будет распознаваться, если цель сборки меньше 13.

Это может быть другое изменение конфигурации, которое вызывает активность reset. Следующая ссылка содержит список возможных изменений конфигурации: http://developer.android.com/guide/topics/manifest/activity-element.html#config