Проблемы с пониманием жизненного цикла, когда экран выключается и включается
Информация:
Мое устройство - 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
Ответы
Ответ 1
См. Документация по жизненному циклу активности для хорошего описания жизненного цикла с диаграммами.
Скорее всего, ваша активность убита, экран отключается, чтобы сэкономить ресурсы (питание от батареи). Как указано в документации, вы можете быть убиты в любое время, когда Android хочет освободить ресурсы. Таким образом, вы всегда должны проектировать свои действия, чтобы их можно было остановить и перезапустить в любое время.
Ответ 2
У меня была такая же проблема с моей собственной игрой. Моя игра работает только в ландшафте, и при выключении экрана заставка андроида берет управление (в портретном режиме), тем самым отправляет directionChange, который разрушает и воссоздает активность.
Простое решение - объявить, что вы будете управлять изменениями ориентации экрана:
<activity ... android:configChanges="orientation" ... >
Это довольно легко, если ваша активность объявлена только ландшафтом (вы ничего не должны делать), но может усложниться, если ваша активность может вращаться...
Ответ 3
ответ Ruben полностью верен, , но только если ваше приложение нацелено на уровень API 12 или ниже.
Но поскольку уровень API 13 помимо опции orientation
, вы должны объявить параметр screenSize
, потому что он также запускается, когда устройство переключается между портретом и ориентациями ландшафта:
<activity ... android:configChanges="orientation|screenSize" ... >
В противном случае ваша активность будет воссоздана еще раз, когда экран исчезнет на API 13 или более высокой платформе.
Для справки см. API docs, примечания раздела android:configChanges
.
Ответ 4
Вот так. Если вы прочтете жизненный цикл активности, вы увидите, что шаги в значительной степени упорядочены таким образом. Это не только когда ваш экран идет и выключается, но также и при использовании мелодии телефона. Android воссоздал активность, выполнив действия, описанные выше. Попробуйте повернуть экран, вы увидите это! =)