我想在SharedPreferences更改时更新远程服务。以下代码用于API level 8 (Android 2.2)。
我的活动有一个OnPreferencesChangedListener
,它通过服务绑定器对象调用远程服务。远程服务的接口提供了一个方法prefsChanged(void)
,该方法由侦听器调用。之后,接口方法会计算警报触发某些操作的新时间。此时间也会保存到SharedPreferences
,并发送广播。广播由我的activity接收,现在可以显示新的警报时间。活动和远程服务通过调用响应PreferenceManager.getDefaultSharedPreferences(Context)
的静态方法GetPrefs(Context)
来获取SharedPreferences
对象。
对于API级别15 (Android 4.0.3),这将停止工作。调试显示,远程服务看到某个其他版本的SharedPreferences持有不同的内容(旧?)值。记录SharedPreferencesImpl对象时,从活动和远程服务记录时会显示不同的地址。文件系统仅显示一个共享首选项文件。
这是一个bug,还是我的代码碰巧能在API level 8上工作?任何建议都将不胜感激。
发布于 2012-01-05 20:48:36
答案在这里,thx to x90:https://stackoverflow.com/a/8723589/1127492
使用MODE_MULTI_PROCESS这是姜饼(Android2.3)中和之前的遗留行为(但没有文档),当目标是这样的版本时,这个标志是隐含的。对于目标SDK版本高于Android 2.3的应用程序,如果需要,必须显式设置此标志。
发布于 2012-01-03 17:48:16
我会在这里查找:http://developer.android.com/sdk/api_diff/15/changes.html,并查看您在应用程序中使用的更改过的包。
发布于 2012-03-06 16:08:56
当我将我的应用程序从Froyo升级到ICS时,也遇到了同样的问题。根据来自ICS的Context.getSharedPreferences源代码,解决方案应该是Context.MODE_MULTI_PROCESS
@Override
public SharedPreferences getSharedPreferences(String name, int mode) {
SharedPreferencesImpl sp;
synchronized (sSharedPrefs) {
sp = sSharedPrefs.get(name);
if (sp == null) {
File prefsFile = getSharedPrefsFile(name);
sp = new SharedPreferencesImpl(prefsFile, mode);
sSharedPrefs.put(name, sp);
return sp;
}
}
if ((mode & Context.MODE_MULTI_PROCESS) != 0 ||
getApplicationInfo().targetSdkVersion < android.os.Build.VERSION_CODES.HONEYCOMB) {
// If somebody else (some other process) changed the prefs
// file behind our back, we reload it. This has been the
// historical (if undocumented) behavior.
sp.startReloadIfChangedUnexpectedly();
}
return sp;
}
https://stackoverflow.com/questions/8710076
复制相似问题