2012-01-28 28 views
0

當一個應用程序被放入後臺並且後來恢復到某個活動時,是否有可能在另一個Activity中設置的靜態類變量可能已被垃圾收集器重置並已將值設置爲零?當Android應用程序恢復時,全局變量的值是否已被重置?

我在我的主Activity中使用了一對公共靜態int變量,並將它們用作各種其他活動中的全局變量。我在Android Market的開發者控制檯收到了一個崩潰報告,其中唯一可以解釋的是該應用恢復爲一個活動,該活動使用另一個類中公共靜態變量的值,但該值具有(神祕?)變成零。我知道應用程序首次啓動時它已被設置爲其他內容。這是可能嗎?

如果我的懷疑是正確的,當應用程序放到後臺時,推薦的方法是保留全局變量的值?將它們保存在OnPause()的SharedPreferences中或使用onSaveInstanceState或其他東西?

回答

4

當一個應用程序被放到後臺並且後來恢復到一個活動時,是否有可能在另一個Activity中設置的靜態類變量可能已被垃圾收集器重置並已將值設置爲零?

它不會被「垃圾回收器重置」。但是,該進程可能已被Android終止,以釋放其他應用程序的內存。

當應用程序置於後臺時,推薦保留全局變量值的方法是什麼?

靜態數據成員應該只是一個緩存。無論發生什麼(例如進程被終止),您想要保留的數據都需要進入某個持久性存儲區,例如平面文件,數據庫或SharedPreferencesonPause()是安排持續保存該數據的可能時間,因爲在此之後的任何時間,您的流程都可能在不通知的情況下終止。

+0

我知道這個過程可以被系統終止。這不是問題。問題是應用程序恢復到不是主要活動的活動時。 – Anders 2012-01-28 16:36:53

+0

@Anders:如果用戶通過最近的任務啓動你的應用程序,控制將返回到用戶上一次進行的任何活動。 – CommonsWare 2012-01-28 16:45:49

+1

從堆棧跟蹤中,我只能看到系統java文件,而不是其中一個文件來自我的源。這讓我認爲應用程序從後臺恢復時會發生崩潰。它在一個不存在於我的主Activity中的微調器上設置了一個值時會崩潰。微調器中使用的ArrayList的大小是在非主要Activity中的onCreate中創建的,並使用我主Activity中全局變量的大小。該值似乎爲零。 – Anders 2012-01-28 16:59:43

0

您可以將此值保存在SQLite on方法onDestroy的activity或其他響應退出的方法中。