onCreate () вызывается, когда Activity остановлено (но не уничтожено). Только после установки

Я работаю над приложением, ориентированным на Api 19, и это в основном скетч Processing.

Проблема, с которой я столкнулся, заключается в том, что при первом запуске моего приложения сразу после его установки оно работает хорошо, пока пользователь не отправит его в фоновый режим. Затем, если они снова нажмут на значок приложения, будет вызвана функция onCreate (), но действие не будет уничтожено или перезапущено. Некоторые переменные меняются, что приводит к странному поведению.

Это происходит ТОЛЬКО при первом использовании приложения. После принудительного закрытия такое поведение больше не повторится (насколько я тестировал). И этого не происходит и при запуске приложения из Eclipse.

Подводя итог, вот что происходит после первого принудительного закрытия (и что я считаю правильным):

  • Активность запущена.

  • Действия отправляются на задний план с помощью кнопки "Домой"

  • onPause ()

  • Снова нажимаем на иконку приложения

  • onResume ()

И вот что происходит ТОЛЬКО при первом запуске приложения после установки:

  • Активность запущена.

  • Действия отправляются на задний план с помощью кнопки "Домой"

  • onPause ()

  • Снова нажимаем на иконку приложения

  • onCreate () ‹- !! примечание нет onDestroy ()

  • onResume ()

Интересно, имеет ли к этому какое-либо отношение тот факт, что я использую иммерсивный режим, но изменение целевой версии Api на 10, удаление иммерсивного режима или тестирование на старых устройствах не помогают. Я, конечно, использовал android: configChanges = "Ориентация | keyboardHidden | screenSize" в моем манифесте.

Кто-нибудь знает, что может быть причиной этого? Это обычная проблема или мне следует искать ошибку в моем коде? Может быть ошибка обработки?

Заранее благодарим за любую подсказку. Я надеюсь, что это правильный способ задать вопрос по этому поводу. Это мой первый пост.

Обновление: Мое объяснение не очень точное, но, по-видимому, для этого есть отчет об ошибке. Проблема гораздо лучше объясняется здесь: https://code.google.com/p/android/issues/detail?id=26658

К сожалению, я не могу заставить предложенные решения работать, использование этого в onCreate () приводит к закрытию или сбою моего приложения:

if (!isTaskRoot()) {
  finish();
  return;
} 

person Kajuna    schedule 27.02.2014    source источник
comment
это интересно, что onCreate снова вызывается из homeScreen ... onDestroy будет вызываться только при нехватке ресурсов, но onPause, onStop - ваши лучшие ставки. Можете ли вы выполнять кодирование в onStop или onPause, или это должно быть в onDestroy ()   -  person reidisaki    schedule 28.02.2014
comment
Извините, onStop - это метод обработки, я думаю, я имел в виду onPause. Я это отредактирую. Дело в том, что я не хочу разрушать свою деятельность или создавать ее снова, я просто хочу приостановить, а затем возобновить ее (я считаю, что это нормальное поведение)   -  person Kajuna    schedule 28.02.2014
comment
Это вообще ненормальное поведение. Действия воссоздаются постоянно, даже после поворота экрана. Ваша задача - сохранить состояние активности, переопределив метод onSaveInstanceState(), а затем снова восстановив его в onCreate(). Однако действие по-прежнему остается в памяти, поэтому экземпляр Activity существует намного дольше.   -  person Floris    schedule 28.02.2014
comment
Включена ли у вас опция разработчика Не оставлять действия?   -  person devunwired    schedule 28.02.2014
comment
Нет, @Devunwired, и это происходит на каждом устройстве. Не только мой: S   -  person Kajuna    schedule 28.02.2014


Ответы (4)


Хорошо, вот как я решил это, на случай, если кто-то еще наткнется на эту стену.

Это может особенно повлиять на людей, приходящих из среды разработки обработки, поскольку она преобразует «эскиз обработки» в единственное действие проекта.

Исходная проблема (Android управляет приложениями другим - неправильным? - способом при их запуске из установщика пакетов) хорошо объяснена здесь: https://code.google.com/p/android/issues/detail?id=26658

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

Добавьте этот бит в метод onCreate () активности запуска:

if (!isTaskRoot()) {
 finish();
 return;
} 

Надеюсь, это поможет.

person Kajuna    schedule 28.02.2014
comment
Спасибо, это действительно очень помогло. - person Lavekush Agrawal; 27.03.2015
comment
Это исправление законное. Если у вас есть приложение, которое использует и требует много памяти, каждый раз, когда это приложение помещается в фоновый режим, оно может быть закрыто. В этом случае вы столкнетесь с проблемой, опубликованной на плакате. Единственное решение - это то, что предоставила Каджуна. Спасибо! - person portfoliobuilder; 04.03.2016

Это похоже на допустимый жизненный цикл приложения: вы переводите приложение в фоновый режим, а затем Android может уничтожить ваше приложение. Вызов onDestroy не гарантируется, вы должны быть готовы к этому, поскольку, как вы говорите, вызывается onPause, поэтому вы можете его использовать. Трудно объяснить, почему это происходит только один раз после установки, но, на мой взгляд, вам не следует об этом беспокоиться и готовить свое приложение к уничтожению в любое время, когда оно находится в фоновом режиме.

person marcinj    schedule 27.02.2014
comment
Соглашаться. Обычно вас совершенно не волнует onDestroy(). - person Floris; 28.02.2014

 Жизненный цикл действия

На диаграмме выше может быть, что метод OnDestroy никогда не вызывается, потому что другому приложению требуется память.

person Mahdi-bagvand    schedule 27.02.2014
comment
В порядке. Итак, следуя диаграмме, вы можете перейти от onStop () к onCreate (), только завершив процесс. В противном случае будет вызван onRestart (). Мне подойдут оба варианта. Проблема, с которой я (думаю) сталкиваюсь, заключается в том, что onCreate () вызывается без предварительного завершения процесса. Имеет ли это смысл? - person Kajuna; 28.02.2014

onStop() - это последний гарантированно вызываемый метод. После этого метода Android может прекратить вашу активность в любое время. Посмотрите таблицу в таблице жизненного цикла активности. Есть столбец «Убиваемый», описывающий время, когда активность может быть убита.

Если вы не используете статические переменные и правильно инициализируете все в onCreate(), тогда у вас не должно возникнуть проблем с таким поведением. Просто никогда не ждите, что вам позвонят onDestroy().

person sergej shafarenka    schedule 27.02.2014