Проблемы с пониманием жизненного цикла, когда экран отключается и включается

Информация: Мое устройство – Nexus One с 2.2, и я проверил два проекта: один на 1.5 и один на 2.1.

Проблема. Мне трудно понять жизненный цикл моего приложения, когда экран выключен и включен.

Вот мой вывод

// activity starts 08-04 17:24:17.643: ERROR/PlayActivity(6215): onStart executes ... 08-04 17:24:17.643: ERROR/PlayActivity(6215): onResume executes ... // screen goes off 08-04 17:24:28.943: ERROR/PlayActivity(6215): onPause executes ... 08-04 17:24:32.113: ERROR/PlayActivity(6215): onStop executes ... 08-04 17:24:32.113: ERROR/PlayActivity(6215): onDestroy executes ... 08-04 17:24:32.983: ERROR/PlayActivity(6215): onStart executes ... 08-04 17:24:32.983: ERROR/PlayActivity(6215): onResume executes ... 08-04 17:24:32.983: ERROR/PlayActivity(6215): onPause executes ... // screen goes on 08-04 17:24:47.683: ERROR/PlayActivity(6215): onResume executes ... // lock removed 08-04 17:24:56.943: ERROR/PlayActivity(6215): onPause executes ... 08-04 17:24:59.663: ERROR/PlayActivity(6215): onStop executes ... 08-04 17:24:59.663: ERROR/PlayActivity(6215): onDestroy executes ... 08-04 17:25:00.943: ERROR/PlayActivity(6215): onStart executes ... 08-04 17:25:00.943: ERROR/PlayActivity(6215): onResume executes ... 

Я совершенно смущен. Почему перезагрузка активности при выключении экрана? И зачем останавливать и перезапускать его снова, когда экран уже включен, и только блокировка была удалена?

Чтобы убедиться, что я не сделал ничего плохого, я создал новый проект только с этой деятельностью. Результат идентичен …

 public class LifeCycleTest extends Activity { private final static String DEBUG_TAG = "FirstLifeLog"; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.e(DEBUG_TAG, "onCreate executes ..."); setContentView(R.layout.main); } protected void onRestart() { super.onRestart(); Log.e(DEBUG_TAG, "onRestart executes ..."); } protected void onStart() { super.onStart(); Log.e(DEBUG_TAG, "onStart executes ..."); } protected void onResume() { super.onResume(); Log.e(DEBUG_TAG, "onResume executes ..."); } protected void onPause() { super.onPause(); Log.e(DEBUG_TAG, "onPause executes ..."); } protected void onStop() { super.onStop(); Log.e(DEBUG_TAG, "onStop executes ..."); } protected void onDestroy() { super.onDestroy(); Log.e(DEBUG_TAG, "onDestroy executes ..."); } } 

У кого-то есть идея?

Обновление с сегодняшнего дня (не понимаю, почему он ведет себя не так, как в прошлый раз, может быть, больше свободных ресурсов?)

 // activity starts 08-09 12:14:03.122: ERROR/FirstLifeLog(15406): onCreate executes ... 08-09 12:14:03.132: ERROR/FirstLifeLog(15406): onStart executes ... 08-09 12:14:03.132: ERROR/FirstLifeLog(15406): onResume executes ... // screen off 08-09 12:14:07.412: ERROR/FirstLifeLog(15406): onPause executes ... // screen on 08-09 12:14:11.722: ERROR/FirstLifeLog(15406): onResume executes ... // no log for removed screen lock 

Solutions Collecting From Web of "Проблемы с пониманием жизненного цикла, когда экран отключается и включается"

См. Документацию по жизненному циклу деятельности для хорошего описания жизненного цикла с диаграммами.

Скорее всего, ваша активность убита, экран отключается, чтобы сэкономить ресурсы (питание от батареи). Как указано в документации, вы можете быть убиты в любое время, когда Android хочет освободить ресурсы. Таким образом, вы всегда должны проектировать свои действия, чтобы их можно было остановить и перезапустить в любое время.

У меня была такая же проблема с моей собственной игрой. Моя игра работает только в ландшафте, и при выключении экрана заставка андроида берет управление (в портретном режиме), тем самым отправляя ориентациюChange, которая разрушает и воссоздает действие.

Простое решение – объявить, что вы будете управлять изменениями ориентации экрана:

 <activity ... android:configChanges="orientation" ... > 

Это довольно легко, если ваша активность объявлена ​​только ландшафтом (вы ничего не должны делать), но может усложниться, если ваша деятельность может вращаться …

Ответ Рубена полностью верен, но только если ваше приложение нацелено на уровень API 12 или ниже .

Но поскольку уровень API 13 в дополнение к опции orientation , вы должны объявить параметр screenSize , потому что он также запускается, когда устройство переключается между портретом и ориентацией на ландшафт:

 <activity ... android:configChanges="orientation|screenSize" ... > 

В противном случае ваша деятельность все равно будет воссоздана еще раз, когда экран отключится на API 13 или более высокой платформе.

Для справки см android:configChanges документам API , android:configChanges .

Это способ. Если вы прочтете жизненный цикл активности, вы увидите, что шаги в значительной степени упорядочены таким образом. Это не только когда ваш экран включен и выключен, но также и когда вы используете мелодию телефона. Android воссоздал активность, следуя описанным выше шагам. Попробуйте повернуть экран, вы увидите это! знак равно