Публичные статические переменные и управление жизненным циклом активности Android

В соответствии с документацией ОС Android может убить активность в задней части backstack.

Итак, скажем, например, у меня есть приложение и откройте главную активность (позвольте мне назвать ее активностью A). В этом классе общественной активности я объявляю и инициализирую общедоступную статическую переменную (назовите ее "foo" ). В методе действия A onCreate() я затем изменяю значение "foo" . Из действия A пользователь запускает другое действие в моем приложении под названием Activity B. Переменная "foo" используется в Activity B. Затем активность B приостанавливается после того, как пользователь переходит к некоторым другим действиям в других приложениях. В конце концов, после нехватки памяти, активность A, а затем активность B, может быть убита. После того, как пользователь переходит к моему приложению, он перезапускает (фактически "воссоздает" ) активность B.

Что происходит:

  • Будет ли переменная "foo" в этой точке иметь значение, установленное для нее, когда запущен метод Activity A onCreate()?

  • Переменная "foo" не существует?

  • Переменная "foo" существует и теперь является инициализированным значением, а не значением, установленным в методе Activity A onCreate()?

Ответ 1

Если процесс убит, все статические переменные будут повторно инициализированы до значений по умолчанию.

Итак, любое значение, которое вы установили в Activity A, не будет сохраняться

Ответ 2

Хорошее объяснение можно посмотреть здесь с 2:50 http://www.infoq.com/presentations/Android-Design

Вот несколько инструкций для тех, кто хочет проверить эту проблему вручную: Создайте эмулятор android v.4, затем перейдите в настройки → настройки разработчика → отключите фоновые задачи. Затем создайте образец проекта Android с двумя действиями, объявить статическую переменную в активности A, инициализировать ее в методе onCreate(). Поместите кнопку в действие A, которое начнет действие B. В методе Activity B onCreate() напечатайте значение A.staticVar для logcat.

Запустить проект - появится действие A. Нажмите кнопку - появится активность B, значение статической переменной будет напечатано на logcat. Нажмите кнопку "Домой" и запустите любую другую программу - ваш примерный процесс проекта будет убит (потому что вы отключили фоновые процессы). Теперь нажмите и удерживайте кнопку "домой" - вы увидите список недавно запущенных программ. Выберите свой образец проекта - ОС попытается восстановить ваш проект back-stack и заново заработает последнее запущенное действие B. Но на этом этапе программа выйдет из строя с помощью NullPointerException, потому что A.staticVar будет пустым, и мы пытаемся напечатать его для logcat.

Ответ 3

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