2012-02-25 75 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

相关问题