2011-04-08 69 views
1

我已經閱讀了SharedPreferences的所有文檔,我有一個具有全局配置的應用程序,所有應用程序都將隨時隨地閱讀和更改。我可以閱讀SharedPreference,但是如何註冊其ChangeListener?爲什麼在第二個應用程序中不調用onSharedPreference?

//應用1

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); 

//應用2

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); 

回答

1

這不是一個很好的實施。

首先,只要用戶卸載my.test.Config_preferences,您的所有應用都將失去其偏好。其次,設備上的每個應用程序都可以讀取這些首選項 - 而不僅僅是你的 - 這對安全和隱私不利。

請給每個應用程序自己的SharedPreferences。或者,如果有必要有一箇中心偏好設置(例如,app-and-plugins模型),則可以通過權限(例如使用AIDL或內容提供者的遠程服務)來保護偏好數據。

0

最終的答案:

更換

getSharedPreferences( 「my.test.Config_preferences」,Context.MODE_WORLD_READABLE)

getSharedPreferences( 「my.test.Config_preferences」,上下文.MODE_MULTI_PROCESS)

0

我學習源代碼後,
我發現base/core/java/android/app/SharedPreferencesImpl.java 可以回答你的問題。
notifyListener使用內存來通知對方,
所以你的兩個應用程序可以相互通信。

相關問題