2012-08-30 59 views
23

根據文檔,Android OS可以終止後臺堆棧的活動。公共靜態變量和Android活動生命週期管理

因此,舉個例子,我有一個應用程序,並打開主要活動(讓我們稱之爲活動A)。在這個公共活動類中,我聲明並初始化一個公共靜態變量(我們稱之爲「foo」)。然後,在Activity A的onCreate()方法中,更改「foo」的值。從活動A開始,用戶在我的應用程序中啓動另一個名爲活動B的活動。在活動B中使用變量「foo」。然後在用戶導航到其他應用程序中的其他活動後,活動B暫停。最終,在發生內存不足之後,活動A然後活動B可能會被終止。用戶返回到我的應用程序後,將重新啓動(實際上是「再現」)活動B.

會發生什麼:在這一點上

  1. 威爾變「富」有被設置爲它當值Activity的onCreate()方法運行?

  2. 變量「foo」不存在?

  3. 變量「foo」存在,但現在是初始化值,而不是在Activity A的onCreate()方法中設置的值?

回答

23

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

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

+0

謝謝你的回答 – jsstp24n5

+0

+1完美答案:) – Lucifer

+8

如果進程沒有被殺死,只有活動被破壞(假設某些服務正在運行)會發生什麼。當Activity再次開始時,靜態變量是否會與上次存儲的值一起存在? – Ahmed

7

答案是(3)。如果您需要保留值,請在每個活動暫停時將其保留在共享首選項中,並在恢復時將其恢復。或者,您也可以維護一個「初始化的」靜態標誌,並在任何活動的onCreate()方法中重新初始化靜態變量(如果它爲假)。

+0

謝謝你的回答。 – jsstp24n5

+0

@Criticalquestionnaire - 我不確定你在找什麼,但請參閱[存儲選項](http://developer.android.com/guide/topics/data/data-storage.html)上的指導主題。如何堅持數據。 –

10

很好的解釋在這裏可以查看從2:50 http://www.infoq.com/presentations/Android-Design

這裏是爲那些誰想要手動測試這個問題的一些說明: 創建的Android模擬器第4節,然後去設置 - >開發人員設定 - >禁用後臺任務。 然後用2個活動創建示例Android項目, 在活動A中聲明靜態變量,並在onCreate()方法中初始化它。 在啓動活動B的活動A中放置一個按鈕。 在活動B的onCreate()方法中,將A.staticVar的值打印到logcat。

啓動項目 - 活動A出現。點擊按鈕 - 活動B出現,靜態變量的值被打印到logcat。按主頁按鈕並啓動任何其他程序 - 您的示例項目過程將被終止(因爲您禁用了後臺進程)。 現在長按主頁按鈕 - 您將看到最近啓動的程序列表。選擇你的示例項目 - 操作系統將嘗試恢復你的項目的活動後備堆棧並重新創建上次運行的活動B.但是在這一步,程序將因NullPointerException異常而崩潰,因爲A.staticVar將爲空,並且我們試圖將它打印到logcat。