2010-02-19 24 views
3

在Android中,您需要實現以下活性的方法使你的應用程序可以恢復到以前的狀態,如果操作系統決定摧毀然後重新創建活動:穩健+簡單的方法來保存/恢復Android應用程序實例狀態

public void onSaveInstanceState(Bundle savedInstanceState) 
public void onRestoreInstanceState(Bundle savedInstanceState) 

我見過的實現這些方法的例子是在Bundle對象上使用put/getBoolean,put/getInt等來保存應用程序狀態。這似乎是一個非常容易出錯的方式來保存你的狀態,我看不出如何在不編寫大量代碼的情況下擴展存儲複雜對象。

我有什麼選擇來以強大且易於實現的方式存儲/恢復狀態?如果它很重要,我的應用程序(遊戲)需要存儲大約50個對象,每個對象可以存儲5個浮點變量和一些商店對其他對象的引用。我並不特別想爲每個類和子類(也許大約15個)編寫保存/恢復方法。如果我可以將所有狀態相關的對象粘在一個名爲「state」的對象中,然後在「state」上調用save/load來處理所有事情,那將是理想的。

正在使用Java序列化選項嗎?我聽說它很慢,但是這是保存/恢復的問題嗎?我能否將我的數據寫入SD卡?到數據庫?

回答

4

看看Bundle班,它支持存儲ParcelableSerializable。所以如果你爲你的狀態對象實現其中一個接口,你應該全部設置。

+0

Doh,謝謝:Bundle有一個「putSerializable」方法。有沒有一個普遍認同的最好的方式來存儲對象,雖然這個目的?例如,我已經看到人們將他們的對象轉換爲JSON字符串,然後將該字符串作爲一個包存儲/加載。序列化真的和人們一樣糟糕嗎?是什麼讓它比平時慢得多(如果這是真的)? – BobbyJim 2010-02-19 19:32:18

+0

我認爲轉換爲JSON只會浪費計算週期。 – 2010-02-20 06:01:51

0

也看看onRetainNonConfigurationInstancegetLastNonConfigurationInstance。它們允許你讓你的物體被O.S.參考。而您的活動未運行,並在重新創建時將其恢復。兩種方法中的第一種是重寫,第二種方法應在onCreate中調用。請注意,它們已被棄用,但在新的android版本中還有其他等效的方法可用。 還要注意的是,文件說

只應作爲優化

,那你必須準備,否則恢復狀態。

在內存中保留對象的另一種方法是對應用程序類進行子類化,如this article中所述。

+0

onRetainNonConfigurationInstance已棄用 – agamov 2013-09-08 15:36:58