Жизненный цикл класса Android-приложений - PullRequest
57 голосов
/ 03 января 2011

Android-приложение, над которым я работаю, переопределяет класс Application для хранения облегченного состояния (имя пользователя, местоположение gps и т. Д.) В статических переменных. Большая часть этого состояния устанавливается в OnCreate активности запуска (имя пользователя извлекается из prefs, слушатель местоположения запускается). Безопасно ли полагаться на запуск при инициализации класса Application? Существуют ли случаи, когда класс Application может быть воссоздан без создания действия Launch?

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

Обратите внимание, что я попытался протестировать подобные сценарии, заставив приложение прекратить использование настроек / управления приложениями. Однако я не могу воссоздать проблему. При следующем запуске создается класс Application, после чего запускается активность сразу после создания.

Безопасно ли предполагать, что экземпляр класса приложения будет существовать до тех пор, пока процесс и что при создании класса приложения он эквивалентен «перезапуску» приложения, т.е. начать с нового стека действий (и первое действие в стеке - это действие запуска)?

Ответы [ 4 ]

20 голосов
/ 03 января 2011

Нет. Все ваше приложение может быть уничтожено и воссоздано с целым стеком задач; это позволяет системе восстанавливать память на устройствах, которые в ней нуждаются, в то же время предоставляя конечному пользователю полную иллюзию многозадачности. Из документов:

Фоновая активность (активность что не видно пользователю и был приостановлен) больше не критично, поэтому система может безопасно убить свой процесс, чтобы вернуть память для другие передние или видимые процессы. Если его процесс должен быть убит, когда пользователь возвращается к деятельность (делая его видимым на снова на экране), его onCreate (Bundle) метод будет вызываться с saveInstanceState это было ранее поставляется в onSaveInstanceState (Bundle), чтобы он может перезапустить себя в том же состоянии как последний пользователь оставил его.

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

Рассмотрите возможность сохранения постоянного общего состояния, которое необходимо инициализировать с помощью Activity, в базе данных SharedPreference или SQLite или передачи его в Activity, для которого оно требуется в качестве дополнительного Intent.

5 голосов
/ 27 ноября 2013

Вы можете протестировать сценарий с помощью killing the process запущенного приложения.

Шаг 1. Откройте приложение и нажмите кнопку Home, чтобы скрыть его в фоновом режиме.

Шаг2. Вызвать adb shell

Шаг 3. Введите команду su (необходимо получить разрешение ROOT, чтобы завершить процесс)

Шаг 4. ps (список всех запущенных процессовНайдите и найдите свой)

Шаг 5. kill 1234 (предположим, что ваше приложение работает в процессе 1234)

Шаг 6. Затем вернитесь на свое устройство и снова щелкните значок запуска.Вы можете обнаружить, что последнее действие в стеке действий вновь открыто.Вы также можете обнаружить, что onRestoreInstanceState() метод вызывается для действия.

4 голосов
/ 05 февраля 2015

Вкратце: выполнить инициализацию в YourApplication.onCreate, а не в некоторых LaunchActivity

Документы для проверки:
- Процессы и потоки
- Руководства по API> Действия

Безопасно ли полагаться на запуск при инициализации класса Application?

Да, если вы помните, что приложение может существовать дольше, чем действие и действие может быть уничтожено и воссоздано.Я не уверен, что намерение будет воскрешено. Действие получено: ЗАПУСК или ПРОСМОТР (для сценария, когда действие было убито как слишком тяжелое, в то время как служба была привязана к приложению в течение длительного времени)Класс приложения может быть воссоздан без действия Launch?

да, если последнее видимое действие не было LaunchActivity
проверка жизненного цикла приложения Android и использование статического

Возможно ли, чтопроцесс был прерван, когда телефон спал, и после его пробуждения класс приложения был воссоздан, верхняя активность в стеке была возобновлена, но операция запуска не была запущена, поэтому класс приложения не был инициализирован?

Если бы было запущено несколько различных действий A, B, C и весь процесс был убит, то я думаю, что ОС Android хороша только для создания активности приложений и C, тогда как A и B будутсоздан при доступе, то есть при возврате к ним.

Можно ли предположить, что экземпляр класса приложения будет существовать до тех пор, пока процесс,

да

и что при создании класса Application это эквивалентно «перезапуску» приложения, т.е.начать с нового стека действий (и первое действие в стеке - это действие запуска)?

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

1 голос
/ 06 декабря 2016

"Я столкнулся с исключением из-за нулевого указателя при доступе к переменной в классе приложения при возобновлении работы приложения"

Проверьте эту ссылку .. http://www.developerphil.com/dont-store-data-in-the-application-object/

...