Android:在活动恢复上更新共享首选不起作用



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

如果我重新启动"活动a",一切都会正常进行,并且新值会正确显示。怎么了?

我调用该方法来读取并显示"活动a"中onResume()的值。

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

提前感谢!

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

例如:

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

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

或者,您可以刷新onStart()中的首选项,因为当发送到活动b时,您的活动可能"不再可见"。

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

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

使用IntentActivity.startActivityForResult。请在此处查看我的答案获取活动中的intent对象

确保在每个活动中使用相同的首选项:如果使用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);

如果你发布有问题的代码片段,这将更容易帮助你;如果你仍然无法让它工作,我会尝试将它添加到你的帖子中。

还值得注意的是,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();

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

  1. 在应用程序清单中,将活动A"launchMode"设置为"标准"

  2. 从活动B结束并返回活动A时,在您的意图中添加一个"flag_activity_CLEAR_TOP"的意图标志,如下所示:

    Intent Intent=new Intent(activity B.this,activity A.class);intent.addFlags(intent.FLAG_ACTIVITY_CLEAAR_TOP);startActivity(intent);finish();

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

希望这能帮助。。。

相关内容

  • 没有找到相关文章

最新更新