我已经阅读了有关SharedPreferences的所有文档,我有一个具有全局配置的应用程序,所有应用程序都希望随意阅读以及何时发生更改。我可以读取SharedPreference,但是如何注册其ChangeListener?
// App1的
sharedPreferences = getSharedPreferences("my.test.Config_preferences", Context.MODE_WORLD_READABLE)
listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(SharedPreferences arg0, String arg1) {
Log.i("TAG", "!!! App1 OnPreferenceChanged()"); //WORKING!
}
};
prefs.registerOnSharedPreferenceChangeListener(listener);
// App2的
otherAppsContext = createPackageContext("my.test.Config", 0);
sharedPreferences = otherAppsContext.getSharedPreferences("my.test.Config_preferences", Context.MODE_WORLD_READABLE);
String s = sharedPreferences.getString("Name", "0"); //OK value
listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences arg0, String arg1) {
Log.i("TAG", "@@@ App2 OnPreferenceChanged()");
//NOT WORKING!
}
};
sharedPreferences.registerOnSharedPreferenceChangeListener(listener);
答案 0 :(得分:1)
这不是一个好的实现。
首先,只要用户卸载my.test.Config_preferences
,您的所有应用就会失去首选项。
其次,设备上的每个应用程序都可以读取这些偏好 - 而不仅仅是你的偏好 - 这对安全性和隐私性有害。
请为每个应用程序提供自己的SharedPreferences
。或者,如果需要一组中央首选项(例如,app-and-plugins模型),则通过权限(例如使用AIDL的远程服务或内容提供商)保护首选项数据。
答案 1 :(得分:0)
最终答案:
替换
getSharedPreferences(“my.test.Config_preferences”,Context.MODE_WORLD_READABLE)
与
getSharedPreferences(“my.test.Config_preferences”,Context.MODE_MULTI_PROCESS)
答案 2 :(得分:0)
在我学习源代码后,
我找到了base / core / java / android / app / SharedPreferencesImpl.java
可以回答你的问题
notifyListener使用Memory来相互通知,
所以你的两个应用程序可以相互通信。