【问题标题】:When to use getSharedPreferences vs savedInstanceState?何时使用 getSharedPreferences 与 savedInstanceState?
【发布时间】:2014-09-09 10:05:23
【问题描述】:

我试图弄清楚何时使用保存的实例状态与从共享首选项文件加载信息。我有两个变量要保存,时间和分数。我想确保如果用户返回游戏屏幕,无论是从 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 需要一个名称?我什么时候需要名字?它必须保持类型字符串吗?

【问题讨论】:

  • SharedPreferences 作为简单的键/值对保存在某些文件中。它们是持久存储,因此您保存在那里的内容会一直保留在那里,直到您覆盖它。你所说的 OnSaveInstanceState 完全不同。操作系统内部使用它来存储和恢复后台堆栈中的Activity 实例。

标签: android xml sharedpreferences android-lifecycle onrestoreinstancestate


【解决方案1】:

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

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

【讨论】:

  • 好酷的豆子。谢谢!还有一个问题,当为存储在 sharedPreferences 中的键值对定义键时,例如 (public static final String ARG_SCORE = "score";) 为什么要存储 "score" 字符串?什么时候会用到这个?我总是使用 (args.putInt(ARG_TIMER, timerINT);) 之类的东西将一个值放入 key_value 对中,并使用 (scoreINT=savedInstanceState.getInt(ARG_SCORE);) 进行检索。为什么键 ARG_SCORE 需要一个名称?它必须保持类型字符串吗?
  • "score" 存储在变量 SCORE 中,因此当您将 ARG_SCORE 放入 key 时,其值将被视为 key 而不是本身。
  • 我不太确定我是否理解。 - 所以字符串“score”存储在 ARG_SCORE -a 值,假设 5 存储到 ARG_SCORE -ARG_SCORE 通过 args.putInt(ARG_TIMER, 5) 存储在文件中;我不明白你的意思:-“'score'存储在变量SCORE中”; (我以为你的意思是 ARG_SCORE 而不是 SCORE?) -“所以当你把 ARG_SCORE 放在键中时”; (不是 ARG_SCORE 键吗?) -“它的值将被视为键而不是自身”; (它的意思是ARG_SCORE?值是5?那么你是说5被视为关键?)
【解决方案2】:

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

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

    SQLite 数据库

【讨论】:

    【解决方案3】:

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

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

    希望对你有帮助。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        在 Android 文档中说明了如何使用 relate SharedPreferences to XML,但如果您不想永久存储数据,则无需使用 SharedPreferences,您可以使用 Activitys 生命周期方法存储游戏状态没问题,但例如,如果用户关闭手机或按下返回按钮完成您的Activity,那么savedInstanceState 将不起作用,您将丢失数据。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-08-22
          • 2020-06-24
          • 2013-03-10
          • 2012-03-12
          • 2012-08-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多