2015-09-06 9 views
2

Предположим, что у меня есть приложение Android с двумя действиями (Activity1 и Activity2). В Activity1 я объявляю public static Boolean foo = true.Жизнь публичной статической переменной в Android

Когда я finish() Activity1 и перейти к деятельности2, я могу видеть, что «Foo» переменные имеют значение true

Но когда система имеет мало памяти (например, потому что есть много приложений, запущенных на устройстве), то , когда я на Activity2, я вижу, что значение переменной «foo» равно null.

Как это объясняется?

+2

Ответ на этот вопрос может быть решением вашей проблемы. http://stackoverflow.com/questions/9541688/static-variable-null-when-returning-to-the-app – HyperZ

+0

Что я не понимаю, когда я заканчиваю() Activity1, почему я могу увидеть значение «foo» истинно, и когда система убивает его, значение «foo» равно null – Fivos

+0

Вероятно, потому что 'null' является значением по умолчанию для вашей статической переменной' foo', как указано в ответе @Kishan Vaghela. – HyperZ

ответ

4

Важно отметить, что жизнь статической переменной связана с процесса а не активности. Даже если ваша активность уничтожена, статическая переменная по-прежнему будет живой (поэтому вы видите, что ее значение установлено на true). Только когда процесс уничтожается, статическая переменная будет освобождена должным образом.

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

Для вашего конкретного сценария, это означает, что:

  • Act1 создал & установить переменную; Вы перешли от aCt1 к act2
  • Процессы убит в БГ
  • Когда система пытается восстановить, вы в конечном итоге обратно в act2
  • Однако, так как инициализация этой переменной произошло в aCt1, (который не был инициализирован), переменная не устанавливается.
+0

Спасибо @Colt McAnlis за ваш конкретный ответ. В senario, что процесс был уничтожен, и я нахожусь в Activity2 приложения, почему переменная имеет значение null? Моя активность запуска - Activity1, поэтому переменная «foo» должна быть снова инициализирована до «true», прежде чем перейти к Activity2. Что мне не хватает? – Fivos

+1

Отредактировал свой ответ, чтобы быть более конкретным для вашего сценария. –

0

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

Так любое значение вы установили в Activity1 не будет сохраняться

+0

Я думаю, что процесс не убит, потому что тогда мое приложение также будет убито. Вы имеете в виду, что Activity1 убит? – Fivos

+1

Очень вероятно, что ваш процесс ** будет убит **. 'Ваше приложение на самом деле очень часто убивается, если для другого приложения с более высоким приоритетом (как правило, если он находится на переднем плане, это более высокий приоритет) нужны ресурсы.Это связано с природой мобильных устройств с относительно ограниченными ресурсами. '-> http://stackoverflow.com/questions/9541688/static-variable-null-when-returning-to-the-app Также читайте комментарии. .. – HyperZ

+0

Я сказал выше, что я думаю, что процесс не убит, потому что мое приложение находится на переднем плане, когда это происходит, поэтому, если процесс был убит, мое приложение закроется. – Fivos

0

Вы назвали статические переменный класс активности, класс name.static переменным.

Class1:

Public class1 extends Activity{Public static boolean foo = true;} 

Class2: вызов class1 переменная

Public class2 extends Activity { class1.foo // call variable } 
+1

В чем это отвечает на вопрос ОФ? OP уже знает, как вызвать переменную, поскольку он может видеть значение для 'foo'. Однако он не знает, почему это значение внезапно «null». – HyperZ