2012-02-25 80 views
0

我希望將一些簡單類的實例作爲保存應用程序狀態的一部分存儲在活動未聚焦時。我應該將對象保存爲地塊還是單獨存儲變量?

public class Player 
{ 
    int score1; 
    int score2; 
    int total; 
} 

我被告知包裹是要走的路。這對於使用下面的方法單獨保存變量有什麼好處?

savedInstanceState.putInt(player.getScore1); 

編輯: 我可能會存儲多達每個類的50個實例,並最終提高他們中的變量數爲12

系列化發展出來的,但我到處轉,我告訴它這是一種緩慢低效的存儲方法,甚至android文檔建議避免它。

回答

0

我使用以下方法來存儲我的玩家實例。

public Object onRetainNonConfigurationInstance() 
{ 
    if (table != null) // Check that the object exists 
     return(table); 
    return super.onRetainNonConfigurationInstance(); 
} 

存儲的表實例包含一個包含所有我的播放器實例的數組。當我重新加載應用程序中的表對象是在onCreate方法中使用此代碼加載:

if (getLastNonConfigurationInstance() != null) 
    { 
     table = (Table)getLastNonConfigurationInstance(); 
    } 

*這個方法折舊卻沒有一個我的beta測試的手機有過任何問題。

*這隻適用於當您的應用程序已被您的手機操作系統關閉而不是手動關閉時。許多用戶會按下後退按鈕,不知道它關閉應用程序,而家庭最小化。下面的文章有許多好方法來規避這種情況。

http://www.androiduipatterns.com/2011/03/back-button-behavior.html

0

我的第一條建議是使用SharedPreference而不是savedInstanceState。 savedInstanceState擁有自己的pro和con。 如果應用程序通過用戶交互(如後退或主頁按鈕)關閉,則不會調用savedInstanceState。僅當應用程序受到Android o.s.干擾時才調用它。本身就像你正在使用應用程序和呼叫發生,應用程序在後臺進行。 在sharedpreference中,你將掌握自己想要的方式編寫自己的邏輯。

+0

我想,當回到家裏或按下該應用程序保持打開狀態,直到操作系統選擇只將其關閉,由於內存限制,在這一點savedInstanceState叫? 我以爲savedInstanceState被用來保存實例狀態。如果我們按回來,它沒有被調用是沒有用的:s – Deco 2012-02-25 16:53:02

+0

它是你的應用程序的實例狀態,而不是你的活動。你將活動的狀態*保存在你的活動中。當你的應用程序*即將被殺死的時候,回調會發生在一個包中。 – 2012-02-28 15:57:13

0

無論是通過系統還是使用來終止一個活動,總是調用onPause()方法。 您可以使用SharedPreferences來存儲您的值,並因此可以在再次創建活動時檢索它。

根據你的代碼,你可以作出這樣的改變:

public class Player extends Activity { 

    private SharedPreferences mPrefs; 
    int score1; 
    int score2; 
    int total; 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    SharedPreferences mPrefs = getSharedPreferences(); 
    score1 = mPrefs.getInt(String key1, int defaultValue); 
    score2 = mPrefs.getInt(String key2, int defaultValue); 
    total = mPrefs.getInt(String key3, int defaultValue); 
} 

    protected void onPause() { 
    super.onPause(); 

    SharedPreferences.Editor ed = mPrefs.edit(); 
    ed.putInt(key1, score1); 
    ed.putInt(key2, score2); 
    ed.putInt(key3, total); 
    ed.commit(); 
} 
} 

String key是首選項的名稱。

int defaultValue是未存儲任何內容時返回的默認值。它通常在第一次創建活動時返回

+0

我將創建這個類的幾個實例。使用key1/key2/key3作爲名稱將無法正常工作嗎? 我可能會存儲多達50個這些類中的每個類的實例,並最終將它們中的變量數量增加到12個。是否使用共享首選項和諸如key599之類的變量理想? 序列化讓人想起,但隨處可見,我被告知這是一種緩慢低效的存儲方法,甚至android文檔建議避免它。 – Deco 2012-02-28 15:43:40

相關問題