2012-09-14 84 views
0

我有2個應用程序應用程序1(com.mine.app1),其中我已聲明SharedPreferenceSharedPreferences交叉應用程序

SharedPreferences controlinfo = getSharedPreferences("pincode", MODE_WORLD_WRITEABLE | MODE_WORLD_READABLE); 
SharedPreferences.Editor editor = controlinfo.edit(); 

editor.putString("pincode", "dddd"); 
editor.commit(); 

我有一個應用程序2(com.mine.app2),其中我嘗試讀出從應用程序的SharedPreference 1.

在這裏,我有以下代碼(下一個按鈕的onclick):

Context con = createPackageContext("com.mine.app1", 0); 
SharedPreferences interalPref = getSharedPreferences("pincode", MODE_PRIVATE); //shared pref of App 2 (this app) 
SharedPreferences externalPref = con.getSharedPreferences("pincode", MODE_PRIVATE); //shared pref of App 1 
//note: MODE_PRIVATE doesn't matter 

String internalPincode = interalPref.getString("pincode", "none"); 
String externalPincode = externalPref.getString("pincode", "none"); 

在這種情況下,我得到internalPincodeexternalPincode「無」。

然而,當我改變getSharedPreference順序:

Context con = createPackageContext("com.mine.app1", 0); 
SharedPreferences externalPref = con.getSharedPreferences("pincode", MODE_PRIVATE); //shared pref of App 1 
SharedPreferences interalPref = getSharedPreferences("pincode", MODE_PRIVATE); //shared pref of App 2 (this app) 

String internalPincode = interalPref.getString("pincode", "none"); 
String externalPincode = externalPref.getString("pincode", "none"); 

我這種情況下我得到兩個internalPincodeexternalPincode「DDDD」(這是在應用程序1(com.mine.app1)中設置的值)

我預計internalPincode將返回「none」和externalPincode「dddd」在這兩種情況下。

爲什麼不呢?

回答

3

我有一個應用程序2(com.mine.app2)中,我試圖從應用程序1.

這是不是一個好主意讀出SharedPreference。用戶可以隨時擺脫應用程序1,此時應用程序2不能再獲取該數據。

而是使用同步模型。當首選項更改時,應用程序1發送廣播Intent,並附帶簽名級權限,以便只有應用程序2(或您編寫的任何其他人)可以接收它。應用程序2然後可以更新其自己的本地數據存儲(例如,它自己的SharedPreferences)。應用程序2也可以這樣做,允許用戶修改其偏好數據的副本併發送廣播以讓其他應用程序知道。這樣,如果刪除了任何一個應用程序,則其他應用程序不會丟失其偏好數據,但所有內容都可以保持同步。

+1

感謝您指出我答案中的缺陷。我已經刪除它以防止誤導。 –

+0

@CommonsWare:謝謝你向我展示另一種解決方案,但這不是我要找的。我在尋找一個同步解決方案,我可以輕鬆地在我的應用程序中查找設置,而無需創建ContentProvider(由於開銷)或廣播數據。我喜歡將此代碼用作多個項目中使用的「助手」類。 – RvdK

+0

嗯......這個解決方案的缺陷是應用程序1永遠不會知道應用程序2所做的更改,而應用程序1沒有運行。應用程序1將啓動,閱讀其自己的偏好,並保持無視。我沒有看到有兩個應用程序用於共享偏好數據的外部共享文件。 – JamieB

相關問題