Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top