Проблемы с пониманием жизненного цикла при выключении и включении экрана - PullRequest
20 голосов
/ 04 августа 2010

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

Ответы [ 4 ]

30 голосов
/ 14 ноября 2010

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

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

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

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

4 голосов
/ 26 июня 2015

Ответ Рубена является полностью правильным, , но только если ваше приложение предназначено для уровня API 12 или ниже .

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

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

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

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

0 голосов
/ 04 августа 2010

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

0 голосов
/ 04 августа 2010

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

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

...