为什么在第二个应用程序中没有调用onSharedPreference?

时间:2011-04-08 04:54:45

标签: android

我已经阅读了有关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);

3 个答案:

答案 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来相互通知,
所以你的两个应用程序可以相互通信。