何时使用getSharedPreferences而不是savedInstanceState?

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文件中,这正确吗?是否有人有一个示例XML可以展示我的sharedPrefs应该如何出现?保存在savedInstanceState捆绑包中的键也会保存到XML文件中吗?如果是这样,有什么示例?如果不是,那么信息存储在哪里?

谢谢!


编辑:

好的,太棒了,谢谢!还有一个问题,当为存储在sharedPreferences中的键值对定义键时,例如:

public static final String ARG_SCORE = "score";

为什么要存储“score”字符串?这会在什么情况下被使用?我总是使用类似以下方式将值放入键值对中:

args.putInt(ARG_TIMER, timerINT);

并使用以下方式检索

scoreINT=savedInstanceState.getInt(ARG_SCORE);
为什么需要为键(key)ARG_SCORE指定一个名称?我何时需要使用这个名称?它必须保持为String类型吗?
为什么需要为键(key)指定名称呢?这是因为在编程中,我们需要通过名称来引用特定的键(key),而不是根据其位置或索引。名称可以让代码更加易读且易于维护。
当您需要查找或修改与该键相关联的值时,您需要使用键的名称。如果你只是在创建一个简单的字符串映射表时,那么将其保持为String类型是没有问题的。但是,如果您需要将键关联到其他数据类型,则可以选择相应的类型来表示键的值。

“SharedPreferences” 以简单的键值对形式保存在某个文件中。它们是持久化存储,因此您在其中保存的内容会一直保留,直到您覆盖它。而所谓的 OnSaveInstanceState 则完全不同。它是由操作系统内部用于从后台堆栈中存储和恢复“Activity”实例的。 - Xaver Kapeller
https://google-developer-training.gitbooks.io/android-developer-fundamentals-course-concepts/content/en/Unit%204/91_c_shared_preferences.html - under
5个回答

14

如果你需要频繁地在不同的活动之间来回移动,可以使用saveInstanceState方法;而当你需要长时间保存信息时,则可以使用SharedPreferences。是的,共享首选项存储在一个xml文件中,你可以使用Eclipse中的DDMS查看。

请记住,当你关闭应用程序时,saveInstanceState方法会将信息从内存中删除,因此信息也会丢失。而使用SharedPreferences,即使你关闭了应用程序,信息仍将保留。


好的,很酷。谢谢!另外一个问题是,在定义存储在sharedPreferences中的键值对的键时,比如(public static final String ARG_SCORE = "score";),为什么要存储“score”字符串?这会在什么时候用到?我总是使用类似于(args.putInt(ARG_TIMER,timerINT);)将值放入键值对中,并使用(scoreINT = savedInstanceState.getInt(ARG_SCORE);)进行检索。为什么需要键ARG_SCORE的名称?它必须保持String类型吗? - cjayem13
"score" 存储在变量 SCORE 中,因此当您将 ARG_SCORE 放入键中时,它的值将被视为键,而不是其本身。 - Waqar Ahmed
我不太确定我理解了。-因此,字符串“score”存储在ARG_SCORE中。 -一个值,比如5,被存储到ARG_SCORE中。 -通过args.putInt(ARG_TIMER, 5);将ARG_SCORE存储在文件中。我不明白你的意思是:-“'score'存储在变量SCORE中”;(我假设你指的是ARG_SCORE而不是SCORE?)-“所以当你把ARG_SCORE放在键中时”;(ARG_SCORE不是键吗?)-“它的值将被视为键而不是它本身”;(它的意思是ARG_SCORE吗?值是5吗?那么你是说5被视为键吗?) - cjayem13

2

这将取决于您希望如何管理数据。以下是可行的选项:

  • 如果您想要填写一次并保留数据(即使应用程序被杀死),请使用SharedPreferences
  • 如果它是易失性数据,需要在其他时间重新输入不同的数据(例如几天后),则使用onSavedInstanceState
  • 如果您想在同一设备上保留多个数据集,则使用SQLiteDatabase


2
通常情况下,当您希望在不同的应用程序会话之间保留某些信息时,可以使用SharedPreferences。想象一下,您想存储信息,并希望在用户关闭应用程序后仍能检索该信息。 SavedInstanceState 用于在用户使用应用程序时保持一些信息,并允许您跟踪活动或片段的临时状态。
希望这有所帮助。

1
当您按下主页按钮时,仍然会在后台保留您的活动。由于Android存在一些内存限制,其他应用程序始终有机会占用您的内存。因此,为了从我们离开的同一点恢复应用程序,我们使用saveInstanceState。在需要保存小信息(通常是基本类型),如游戏中的最高分数时,我们使用sharedprefrence。

1
在Android文档中,介绍了如何将SharedPreferences与XML关联起来,但如果您不想永久存储数据,可以使用Activity的生命周期方法来存储游戏状态,但例如,如果用户关闭手机或按下返回按钮以完成您的Activity,则savedInstanceState将无法工作,您将会失去数据。
这是您的选择,如果您希望即使用户关闭手机也保存游戏(我认为这有点激进,但如果这是您的要求,请继续使用SharedPreferences或DB(如果数据复杂)。如果您只想在用户进入和退出应用程序时保存游戏,则使用savedInstanceState是安全的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接