Жизненный цикл статического объекта Android

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

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

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

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

Ответ 1

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

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

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

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

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

  • напечатать неинициализированный статический файл в onCreate вашей активности → должен печатать нуль
  • инициализировать статическую. print it → значение будет не равно null
  • Нажмите кнопку "Назад" и перейдите на главный экран. Примечание. Главный экран - это еще одно действие.
  • Запустите свою активность снова → статическая переменная будет не нулевой
  • Убейте свой прикладной процесс из DDMS (кнопка остановки в окне устройств).
  • Перезапустите свою активность → статическое значение будет иметь нулевое значение.

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

В Android-документе: Состояние активности и выброс из памяти,

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

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

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

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