Android:在活动恢复时更新SharedPrefereces不起作用

时间:2011-06-09 13:29:58

标签: android android-activity sharedpreferences onresume

我有一个“活动a”,它会从SharedPreferences读取一些值并在TextView中显示,然后我调用“活动b”,其中来自SharedPreferences的值得到更新并写回SharedPreferences。最后,我按回按钮返回“活动a”,现在应该从SharedPreferences读取新的(更新的)值并显示在TextView中。但问题出现了,刚从SharedPreferences读取的值仍然没有更新(不是活动b设置的新值)(从logcat输出得到),怎么回事? SharedPrefs是否需要某种手动刷新?

如果我重新启动“活动a”,一切正常,新值正确显示。怎么了?

我调用该方法阅读并在“活动a”中显示onResume()的值。

我还尝试重新实例化SharedPrefs-Object(使用getSharedPreferences()),但它也无济于事。

提前致谢!

5 个答案:

答案 0 :(得分:1)

SharedPreferences不适用于在活动之间共享数据

使用IntentActivity.startActivityForResult。在这里看到我的答案 Get the intent object in an activity

答案 1 :(得分:1)

您是否在活动b中调用commit()方法来保存新值。

例如:

SharedPreferences customSharedPreference = getSharedPreferences("abcprefs", 0);
SharedPreferences.Editor editor = customSharedPreference.edit();
editor.putString("key", "val");
editor.commit();

其次,你可以在发送到活动b之前完成()活动a,然后从活动b中创建一个新的活动实例a,并调用onCreate()。

或者,您可以刷新onStart()中的首选项,因为您的活动可能已经不再可见了#34;发送到活动b。

请参阅http://developer.android.com/guide/topics/fundamentals/activities.html以查看活动生命周期。

答案 2 :(得分:0)

确保在每项活动中使用相同的首选项:如果您使用getSharedPreferences,则应指定文件和访问级别。在你的情况下,听起来像是getDefaultSharedPreferences

此外,请确保您不仅要设置首选项,还要提交更改:

SharedPreferences preferences = getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("key", "value");
editor.commit();

然后在你的其他活动中:

SharedPreferences preferences = getDefaultSharedPreferences(this);
boolean myPreference = preferences.getBoolean("key", defaultValue);

如果您要发布有问题的代码,这将更容易帮助;如果您仍然无法使其正常工作,我会尝试将其添加到您的帖子中。

答案 3 :(得分:0)

同样值得注意的是,每次调用preference.edit()都会返回一个不同的SharedPreferences.Editor,因此将编辑器存储到一个单独的变量中很重要,用它来写出首选项,然后提交编辑。例如。这不起作用:

myPrefs.edit().putInt("pref", 1);
myPrefs.edit().putBoolean("pref", true);
myPrefs.edit().commit();

需要(如已经证明的那样):

SharedPreferences myPrefs = getSharedPreferences("pref_name", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = myPrefs.edit();
editor.putInt("pref", 1);
editor.putBoolean("pref", true);
editor.commit();

答案 4 :(得分:0)

要能够使用从活动B发送到SharedPreferences的数据来更新您的活动A,同时又从B恢复活动A,请执行以下操作:

  1. 在您的应用清单中,将活动A“ launchMode”设置为“ standard”

  2. 从活动B完成并返回活动A后,将意图标记“ FLAG_ACTIVITY_CLEAR_TOP”添加到意图中,如下所示:

    Intent intent = new Intent(activityB.this,activityA.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); finish();

要解释代码,:“ FLAG_ACTIVITY_CLEAR_TOP”检查正在启动的活动A是否已在当前任务中运行,然后将所有其他活动放在顶部,而不是启动该活动的新实例通过onNewIntent方法,销毁它的意图,并将此意图传递到Activity的恢复实例(现在位于顶部)。点击此链接以了解有关android任务和后退堆栈的更多信息:https://blog.mindorks.com/android-task-and-back-stack-review-5017f2c18196

希望这对您有帮助...