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

Жизненный цикл класса приложений Android

Приложение android, над которым я работаю, переопределяет класс Application для хранения легкого состояния (имя пользователя, местоположение gps и т.д.) в статических vars. Большая часть этого состояния задана в OnCreate активности запуска (имя пользователя, полученное из prefs, runer). Можно ли полагаться на активность запуска для инициализации класса Application? Существуют ли случаи, когда класс приложения может быть воссоздан без создания активности запуска?

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

Шаг 2. Вызов adb shell

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

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

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

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

Ответ 3

Короче: выполните инициализацию в YourApplication.onCreate, а не какую-то LaunchActivity

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

Можно ли полагаться на активность запуска для инициализации класса Application?

Да, если вы помните, что приложение может существовать дольше, чем активность и активность могут быть убиты и воссозданы. Я не уверен, что намерение будет воскрешено. Activity get: LAUNCH или VIEW (Для сценария, когда активность была убита как слишком тяжелая, в то время как длительное обслуживание было привязано к приложению)

Существуют ли случаи, когда класс приложения может быть заново создан без создания активности запуска?

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

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

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

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

да

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

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