我有
SharedPreferences myPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
和
myPreferences.getBoolean("checkbox", true)
那么,我的主要活动如何知道用户何时更改偏好状态?例如,如果用户不想再收到通知。谢谢。
您可以重新阅读 中的所有首选项Activity.onResume()
,或者只要您的主要活动启动首选项活动(例如从菜单中),您就可以启动startActivityForResult(Intent, int)
并重新阅读 中的所有首选项onActivityResult(int, int, Intent)
。
我还发现在开始适当的行为之前重新检查每个相关的偏好就足够了(即在Notification
为您的示例发布之前)。
您需要实现 onSharedPreferenceChangeListener 接口。然后注册以在您的 onCreate/onStart 中接收更改更新:
myPreferences.registerOnSharedPreferenceChangeListener();
在您的听众中,您可以执行以下操作:
@Override
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
if (key.equals("MyKey")) {
// Do something.
} else if (key.equals("MyOtherKey")) {
// Do something else.
}
}
记得在 onStop/onDestroy 中移除监听器。
您可以创建一个静态布尔值,只要更改首选项或启动您的首选项活动,该值就会更改。这个布尔值的目的是让你的主要活动知道偏好是脏的,需要重新加载。onResume
如果mDirty
标志为真,则应重新加载它们。
另一种选择是重新加载所有首选项onResume
,无论如何。这可能效率不高,但是如果您没有很多偏好,那也没关系。
最有效的方法是为您的首选项活动中的所有首选项设置 onPreferenceChanged 侦听器,然后首选项仅在实际更改时通知活动。这解决了当您的用户输入您的偏好活动时的情况,但实际上并没有改变任何东西。