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


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

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

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

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

4 94

4 ответа:

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

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

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

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

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

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

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

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

  • используя намерение, вы можете передать критерии поиска от действия до деятельности (похожие веб по протоколу HTTP запрос)
  • через настройки приложения, вы может сохранить значения и получить они в той деятельности, которая им нужна
  • С помощью базы данных sqlite вы можете сохранять их в таблице и извлечения их потом
  • Если вам нужно просто сохранять активность состояние так, что при перезапуске, поля наполнитесь их ранее выбранный значения, которые можно реализовать на данные метода onsaveinstance() деятельность способ - обратите внимание, что это не рекомендуется для промежуточных мероприятий упорство государств.

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

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

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

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

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

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

в Android doc:состояние активности и выброс из памяти,

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

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

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

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