13

我试图弄清楚何时使用保存的实例状态与从共享首选项文件加载信息。我有两个变量要保存,时间和分数。我想确保如果用户返回游戏屏幕,无论是从 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 文件。这个对吗?有没有人有我的 sharedPrefs 应该如何显示的示例 xml?保存到 savedInstanceState 包的键是否也存储在 xml 文件中?如果是这样,有什么例子吗?如果不是,信息存储在哪里?

谢谢!


编辑:

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

public static final String ARG_SCORE = "score";

为什么要存储“分数”字符串?什么时候会用到这个?我总是使用类似的东西将一个值放入 key_value 对

args.putInt(ARG_TIMER, timerINT);

并使用检索

scoreINT=savedInstanceState.getInt(ARG_SCORE);

为什么键 ARG_SCORE 需要一个名称?我什么时候需要名字?它必须保持类型字符串吗?

4

5 回答 5

13

saveInstanceState当您经常在两者之间来回移动activities时使用,SharedPreferences当您想要长时间保留信息并且是的共享首选项存储在xml文件中时使用。DDMS你可以在eclipse中查看使用。

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

于 2014-07-18T09:53:20.700 回答
2

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

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

    SQLite数据库

于 2014-07-18T09:55:26.820 回答
2

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

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

希望能帮助到你。

于 2014-07-18T09:57:24.070 回答
1

在 Android 文档中说明了如何将 SharedPreferences 与 XML 关联,SharedPreferences如果您不希望数据永久存储,则无需使用,您可以使用Activitys 生命周期方法毫无问题地存储游戏的状态,但例如,如果用户关闭手机或按后退按钮完成您的Activity,然后savedInstanceState将无法正常工作,您将丢失数据。

这是您的电话,如果您希望即使用户关闭手机也能保存游戏(我认为这有点激进,但如果这是您的要求,请继续),SharedPreferences如果它是复杂数据,请使用或数据库。如果您希望仅在用户导航进出您的应用时才保存游戏,那么使用savedInstanceState.

于 2014-07-18T10:05:32.417 回答
1

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

于 2014-07-18T09:59:20.260 回答