我在Android中使用 SharedPreferences 。所有内容在同一会话中都很有效。
但是,一旦我重新启动应用程序,从之前的会话设置的所有首选项都将丢失。
我是否需要指定任何内容来告诉 SharedPreferences 在运行之间徘徊?
我正在通过调用
来创建首选项SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
然后我通过例如
设置属性preferences.edit().putString(key, value);
我通过
得到它preferences.getString(key, defaultValue);
谢谢, 维克多
答案 0 :(得分:26)
SharedPreferences持续重新启动,重启,我认为问题是你没有提交首选项,使用以下来存储首选项中的值:
Preferences.Editor edit=preferences.edit();
edit.putString(key, value);
edit.commit();
答案 1 :(得分:18)
您可能没有提交更改。设置如此属性
SharedPreferences.Editor editor = preferences.edit();
editor.putString(key, value);
editor.commit();
没有承诺,你就会在风中放屁。
答案 2 :(得分:3)
这对我有用,请尝试:
private SharedPreferences mShared;
private Editor mEdit;
mShared = PreferenceManager.getDefaultSharedPreferences(this);
mEdit = mShared.edit();
mEdit.putString(key, value);
mEdit.commit();
答案 3 :(得分:2)
获取pref中的值
SharedPreferences pref1 = getSharedPreferences(PREFS_NAME, 0);
boolean silent = pref1.getString("silentMode", "...");
保存vlue使用onstop或onPause方法
SharedPreferences pref2 = getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = pref2.edit();
editor.putString("silentMode", "...");
这对我来说很好,很健康
答案 4 :(得分:1)
如果您正在开发API级别?在编程修改您的偏好时,您应该使用editor.apply()
而不是editor.commit()
。 editor.commit()
已被弃用,editor.apply()
将处理后台的实际持久性,而editor.commit()
则不会这样做。
请注意,editor.apply()
如果失败,则会默默地执行此操作。
答案 5 :(得分:1)
这是适合我的代码。
package com.example.persistence;
import android.os.Bundle;
import android.widget.EditText;
import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
public class MainActivity extends Activity {
public static final String NOTE_PREFS="note";
SharedPreferences msgSettings;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
msgSettings = getSharedPreferences(NOTE_PREFS,0);
EditText et= (EditText)findViewById(R.id.editText1);
if (msgSettings.contains(NOTE_PREFS)) {
et.setText(msgSettings.getString(
NOTE_PREFS, "my note"));
}
}
@Override
protected void onPause() {
EditText et= (EditText)findViewById(R.id.editText1);
String b = et.getText().toString();
Editor editor = msgSettings.edit();
editor.putString(NOTE_PREFS,b);
editor.commit();
super.onPause();
}
@Override
protected void onDestroy() {
EditText et= (EditText)findViewById(R.id.editText1);
String b = et.getText().toString();
Editor editor = msgSettings.edit();
editor.putString(NOTE_PREFS,b);
editor.commit();
super.onDestroy();
}
}
答案 6 :(得分:0)
在您提交首选项之前,不会保存首选项,即:
// DON'T DO THIS... See Next Example
preferences.edit().putString(key, value);
preferences.edit().commit();
编辑:上面有一个微妙的错误(来自评论);您需要保持对编辑器对象的引用,否则上面提交值的示例将创建一个新实例。应该是:
Preferences.Editor edit = preferences.edit();
edit.putString(key, value);
edit.commit();
供参考,来自Android docs:
请注意,您必须致电commit()才能进行任何更改 编辑器实际上出现在SharedPreferences中。
答案 7 :(得分:0)
很多时间过去了,但你可以使用
.apply()
代替
.commit()
这样会更好。 commit 尝试立即写入,但 apply 是异步的。这是谷歌文档的解释
与将其首选项同步写入持久存储的提交不同,应用会立即将其更改提交到内存中的 SharedPreferences,但会启动对磁盘的异步提交,并且您不会收到任何失败通知。如果此 SharedPreferences 上的另一个编辑器在应用程序仍未完成时执行常规提交,则提交将阻塞,直到所有异步提交以及提交本身完成。