应用程序重启后,PreferenceActivity中的设置未保存

时间:2014-09-18 07:39:22

标签: android preferenceactivity

我的设置活动会延长PreferenceActivity,只要我留在应用中,所有内容都会按预期工作。但是一旦我重新启动应用程序(例如通过Android Studio),所有设置都将恢复为默认设置。

我也尝试设置isPersistent标志,也没有帮助。

settings.xml中的条目示例:

        <CheckBoxPreference
            android:defaultValue="false"
            android:key="askcode"
            android:title="@string/askCodeSettingsString" />
我的子类中的

onCreate方法:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.settings);
    ...

我在重新启动应用时尝试获取设置的方式:

 SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
 boolean keepdata = pref.getBoolean("askcode", false);

我还读到有些人通过更改AndroidManifest.xml中的条目来使其工作,但这看起来不错:

    <activity
        android:name=".SettingsActivity"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.Light" >
    </activity>

修改

我手动存储的其他偏好正在按预期工作:

保存:

SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit();
editor.putString(PREFS_MANUAL, "12345");
editor.commit();

取:

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    String myString = prefs.getString(PREFS_MANUAL, "");
    return myString; // now 12345

编辑2 * 我似乎找到了问题 - 但不是导致问题的原因。我有所有偏好的默认值;对于字符串而言android:defaultValue=""我认为这还不够,但我该如何防止这种情况呢?

09-18 12:13:23.763      925-940/com.... W/SharedPreferencesImpl﹕ getSharedPreferences
org.xmlpull.v1.XmlPullParserException: Map value without name attribute: string
        at com.android.internal.util.XmlUtils.readThisMapXml(XmlUtils.java:568)
        at com.android.internal.util.XmlUtils.readThisValueXml(XmlUtils.java:821)
        at com.android.internal.util.XmlUtils.readValueXml(XmlUtils.java:755)
        at com.android.internal.util.XmlUtils.readMapXml(XmlUtils.java:494)
        at android.app.SharedPreferencesImpl.loadFromDiskLocked(SharedPreferencesImpl.java:113)
        at android.app.SharedPreferencesImpl.access$000(SharedPreferencesImpl.java:48)
        at android.app.SharedPreferencesImpl$1.run(SharedPreferencesImpl.java:87)

1 个答案:

答案 0 :(得分:1)

PreferenceManager调用apply(),将首选项异步保存到持久存储。

所以我的猜测是当你通过DDMS杀死应用程序时,尚未编写首选项。 当您尝试手动保存时,您调用了commit(),它会阻止UI线程,直到将首选项写入持久存储。

在您尝试手动保存的代码段中,如果您拨打apply()而不是commit(),则会得到与使用PreferenceScreen逻辑相同的结果。

当我第一次问你是否正在退出PreferencesActivity时,我认为它可能会引发onStop()onDestroy()事件等的写入,但事实证明它与此无关。 我不熟悉apply()的内部逻辑很多,说明在写入首选项之前你应该等待多长时间,但这不应该花费很长时间。

没有什么可担心的。在最终用户设备上运行时,应用程序通常不会被杀死。

如果您担心不会立即保存偏好设置,唯一的方法是在您希望立即保存的每个OnPreferenceChangeListener上设置Preference并将值写入Editor来电{ {1}}关于偏好更改事件。

如果您这样做,请记住在您手动保存的每个偏好设置commit(),以便它不会再次在后台自动保存。