Подтвердить что ты не робот

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

Информация: Мое устройство - 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
4b9b3361

Ответ 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 воссоздал активность, выполнив действия, описанные выше. Попробуйте повернуть экран, вы увидите это! =)