2015-09-06 51 views
2

假設我有一個包含兩個活動(Activity1和Activity2)的Android應用程序。在Activity1中,我聲明瞭一個public static Boolean foo = trueAndroid中公共靜態變量的使用情況

當我finish()活動1,並移動到活性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」的值爲空 – Fivos

+0

可能是因爲'null'是靜態'foo'變量的缺省值,就像@Kishan Vaghela的答案中指出的那樣。 – HyperZ

回答

4

需要注意的是一個靜態變量的生命是聯繫在一起的過程不是活動是很重要的。即使您的活動已被銷燬,靜態變量仍將保持活動狀態(這就是爲什麼您看到它的值設置爲true)。只有當進程被銷燬時,靜態變量才能被正確釋放。

這也是您不應該使用靜態變量來保存對活動,上下文或視圖的引用的原因之一。巨大的內存泄漏等待發生。

爲您的特定情況下,這意味着:

  • ACT1創建&設置變量;你從ACT1轉移到ACT2
  • 的過程在BG
  • 當系統試圖恢復你,你最終回到ACT2
  • 但是殺害,因爲該變量的初始化在ACT1發生, (尚未初始化)變量未被設置。
+0

謝謝你@Colt McAnlis你的明確答案。在senario中,進程被銷燬了,並且我在應用程序的Activity2中爲什麼變量爲null?我的啓動器活動是Activity1,所以變量「foo」在移動到Activity2之前應該已經重新初始化爲「true」。我錯過了什麼? – Fivos

+1

編輯我的答案是更具體到您的情況。 –

0

如果進程被終止,那麼所有靜態變量將被重新初始化爲其默認值。

所以,無論價值,你在活動1已設置不會存留

+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;} 

等級2:調用class1的變量

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

這回答OP的問題是什麼? OP已經知道如何調用變量,因爲他能夠看到「foo」的值。但是他不知道爲什麼它的值突然變爲'null'。 – HyperZ