Жизненный цикл статического объекта Android - PullRequest
95 голосов
/ 22 декабря 2009

Я создаю приложение поиска событий, мы устанавливаем критерии поиска с одного экрана, заполняющего его на другом экране, затем пользователь может редактировать критерии поиска с 3-го экрана и переходит на 4-й экран.

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

Но я боюсь, если о жизненном цикле статических объектов в Android, если не хватает памяти, Android удаляет статические объекты ???

Поскольку android поддерживает многозадачность, если пользователь переключается на другое приложение и когда пользователь возвращается, приложение начинает себя вести с ума, удаляется ли статический объект, когда он выполняет несколько задач ??? любая идея ?? а также предложить удерживать статический объект с помощью одноэлементного метода.

Ответы [ 4 ]

231 голосов
/ 22 декабря 2009

Давайте начнем с небольшого фона: что происходит при запуске приложения?
ОС запускает процесс и присваивает ему уникальный идентификатор процесса и выделяет таблицу процессов. Процесс запускает экземпляр DVM (Dalvik VM); Каждое приложение работает внутри DVM.
DVM управляет выгрузкой классов, жизненным циклом экземпляров, сборкой мусора и т. Д.

Время жизни статической переменной: статическая переменная возникает, когда класс загружается JVM, и умирает, когда класс выгружается.

Таким образом, если вы создадите приложение для Android и инициализируете статическую переменную, оно останется в JVM до тех пор, пока не произойдет одно из следующих действий:
1. класс выгружается
2. JVM отключается
3. процесс умирает

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

Вы можете проверить это с помощью нескольких строк кода:

  1. печатать неинициализированную статическую переменную в onCreate вашей деятельности -> должен печатать ноль
  2. инициализировать статический. выведите его -> значение будет не нулевым
  3. Нажмите кнопку "Назад" и перейдите на главный экран. Примечание. Главный экран - это еще одно занятие.
  4. Запустите вашу деятельность снова -> статическая переменная будет отлична от нуля
  5. Завершить процесс приложения из DDMS (кнопка остановки в окне устройств).
  6. Перезапустите свою деятельность -> статическое значение будет нулевым.

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

16 голосов
/ 22 декабря 2009

Что ж, шаблон Singleton также основан на использовании статических переменных, так что на самом деле вы находитесь в той же позиции. Хотя статический подход может работать в большинстве случаев, может случиться так, что в некоторых случаях, когда память заполнена, а другое действие выходит на передний план, прежде чем приложение переходит на следующий экран, процесс вашей деятельности может быть уничтожен, и вы потеряете статические значения. Однако Android предлагает несколько вариантов сохранения значений между состояниями или их передачи, таких как:

  • используя Intent, вы можете передать Ваши критерии поиска от активности до активность (аналог веб-http запрос)
  • используя настройки приложения, вы может сохранить значения и получить они в деятельности, которая нуждается в них
  • используя базу данных sqlite вы можете сохранить их в таблице и получить их позже
  • если вам нужно просто сохранить активность состояние так, чтобы при перезагрузке, поля наполни их ранее выбранные значения, вы можете реализовать действие onSaveInstanceState () метод - обратите внимание, что это не рекомендуется для между действиями настойчивость состояний.

Вы можете получить примеры кода использования предпочтений, намерений и базы данных sqlite, взглянув на дерево исходного кода aegis-shield в коде Google или в других приложениях Android с открытым исходным кодом.

6 голосов
/ 07 декабря 2016

После некоторых исследований выясняется, что использование приложения для хранения синглетонов - не самая лучшая идея, если вы не готовы воссоздать ее:

Не хранить данные в объекте приложения

так что, хотя принятый ответ технически верен, он не предоставляет всей информации.

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

3 голосов
/ 12 апреля 2017

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

Согласно документу Android: Состояние активности и извлечение из памяти ,

Система никогда не убивает деятельность напрямую. Вместо этого он убивает процесс, в котором работает деятельность, уничтожая не только деятельность но все остальное работает в процессе, а также.

Вы можете сохранить и восстановить состояние примитивов, а также объектов Serializable и Parcelable, используя методы ниже. Они автоматически вызываются в течение нормального жизненного цикла активности.

protected void onSaveInstanceState(Bundle state) {}
protected void onRestoreInstanceState(Bundle savedInstanceState){}

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

...