我有一个"活动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
不用于在活动之间共享数据
使用Intent
和Activity.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,请执行以下操作:
-
在应用程序清单中,将活动A"launchMode"设置为"标准"
-
从活动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
希望这能帮助。。。