何时使用getSharedPreferences vs savedInstanceState?

时间:2014-07-18 09:51:35

标签: android xml sharedpreferences android-lifecycle onrestoreinstancestate

我正在尝试确定何时使用已保存的实例状态与从共享首选项文件加载信息。我有两个我希望保存的变量,时间和分数。我想确保如果用户返回到游戏屏幕,他们的分数和时间被保存和恢复,无论它是来自onPause状态还是onStop。

我有三把钥匙:

public static final String ARG_SCORE = "score";
public static final String ARG_TIME = "time";
public static final String SHARED_PREFS = "shared_preferences";

如果游戏暂停并显示对话框,则用户返回时应该

public void onRestoreInstanceState(Bundle savedInstanceState){
int score = savedInstanceState.getInt(ARG_SCORE);
}

或者我应该这样做:

protected void onResume(){
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
int score = sharedPref.getInt(getString(R.string.saved_high_score));
}

总的来说,我需要帮助了解生命周期以及何时存储重要信息,例如游戏的时间和分数。我只需要避免用户在无法完成游戏的情况下重新启动。

最后,我假设sharedPrefs保存到xml文件。它是否正确?有没有人有一个样本xml我的sharedPrefs应该如何出现?保存到savedInstanceState包中的密钥是否也存储在xml文件中?如果是这样,任何例子?如果没有,信息存储在哪里?

谢谢!


编辑:

好的酷豆。谢谢!另一个问题是,为存储在sharedPreferences中的键值对定义键,例如

public static final String ARG_SCORE = "score";

为什么存储“得分”字符串?什么时候会被使用?我总是使用像

之类的东西在key_value对中放置一个值
args.putInt(ARG_TIMER, timerINT);

并使用

检索
scoreINT=savedInstanceState.getInt(ARG_SCORE);

为什么键ARG_SCORE需要名称?我什么时候需要这个名字?是否必须保持String类型?

5 个答案:

答案 0 :(得分:9)

当您经常在saveInstanceState和使用activities之间来回移动时,如果您希望长时间保留信息,并使用SharedPreferences中存储的共享偏好,请使用xml文件。您可以在eclipse中使用DDMS进行查看。

记住,在saveInstanceState中,当您关闭应用程序意味着它从内存中删除时,信息也将丢失。在SharedPreferences中,如果您关闭应用程序,信息将保留在那里。

答案 1 :(得分:2)

这取决于您希望如何管理数据。两种选择(以及更多)都是可行的:

  • 如果你想填一次并保留数据,即使应用程序得到了 被杀,使用SharedPreferences.
  • 如果它的易失性数据必须以不同方式重新输入 其他时间(即几天后),然后使用onSavedInstanceState.
  • 如果要在同一设备上保留多个数据集,请使用

    SQLiteDatabase

答案 2 :(得分:1)

如果要在不同的应用会话之间保留一些信息,通常需要使用 SharedPreferences 。想象一下,在用户关闭应用程序之后,您还要存储要检索的信息。

SavedInstanceState 用于在用户使用应用时保留一些信息,并允许您跟踪活动或片段的临时状态。

希望它有所帮助。

答案 3 :(得分:1)

当您按下主页按钮时,您的活动仍然在后台。由于android中有一些内存限制,总有一些其他应用程序可以占用你的记忆。所以要从我们离开的同一点恢复应用程序,我们使用saveInstanceState。 当我们必须在任何游戏中保存游戏高分的小信息(通常是原始类型)时,我们使用sharedprefrence。

答案 4 :(得分:1)

在Android文档中说明如何relate SharedPreferences to XML但如果您不希望数据永久存储,则无需使用SharedPreferences,您可以存储游戏& #39; s状态使用Activity生命周期方法没有问题,但是,例如,如果用户关闭手机或按后退按钮完成Activity,那么savedInstanceState无法正常工作,您将丢失数据。

这是你的电话,如果你想要保存游戏,即使用户关掉他的手机(我认为这有点激进,但如果它是你的要求继续)那么使用SharedPreferences或数据库(如果是复杂数据)。如果您希望仅在用户导入和导出应用时保存游戏,则可以安全地使用savedInstanceState