编辑: 下面描述的问题是由于一个非常特殊的设备问题而不是由任何与编码相关的问题引起的。
我有一个preferenceActivity,其中有很多checkBoxPreferences。checkBoxPreference 假设保存默认的共享首选项文件,然后在我打开应用程序时再次调用以更新 UI。
这不会像预期的那样发生。如果我关闭应用程序并重新打开它,我的值将保持原样,但如果我使用任务管理器结束应用程序或者如果我重启手机(当应用程序未运行时),则调用 defaultValues再次。
所以,我在 onResume() 中创建了一个 SharedPreference 来测试它。
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
然后我检查该共享首选项中是否有密钥。
pref.contains("myCheckBoxPreference");
当我关闭并重新打开它时,它返回true。如果我关闭任务管理器或关闭和打开手机电源,则返回错误。
所以,我尝试手动设置 SharedPreference
SharedPreferences.Editor editor = pref.edit();
editor.putBoolean("myCheckBoxPreference", myCheckBoxPreference.isChecked());
editor.commit();
然后当 checkboxpreference 值改变时我调用它。我还尝试在 onStop 和 onPause 中调用它。尽管如此,如果我关闭应用程序并重新打开它,pref.contains 返回 true,但如果我关闭并重新打开手机,它返回 false。
所以我然后尝试使用 SharedPreferences 文件。
在类声明中:
public static final String PREFS = "prefs";
在 onResume() 中:
SharedPreferences pref = this.getSharedPreferences(PREFS, 0);
同样的行为,如果我只是关闭应用程序并重新打开它,pref.contains 仍然返回 true,但如果我关闭并重新打开手机,它会返回 false。
然后我尝试将 myCheckBoxPreference 的键值更改为与 CheckBoxPreference 的 xml 键不匹配的值,它仍然具有相同的效果。
然后我把手机里的应用程序卸载了,然后关机再开机,再重新安装,还是一样的效果。