2011-09-15 110 views
18

我的應用程序使用SharedPreferences(藉助PreferenceActivity)來存儲所有設置。但是有時候所有的設置都會被刪除,並且所有的值都被設置爲默認值主要在Android 3.x選項卡上。 在普通智能手機上沒有問題。SharedPreferences有時會被刪除

我觀察到,應用程序進程被Android終止時,所有設置都被刪除。 我注意到這一點,因爲通知圖標不再顯示。 我也想知道爲什麼這個過程在平板電腦上而不是在智能手機上被殺死。在我的智能手機上,通知圖標不會消失。

我的應用程序還有一個服務,主進程和服務都對SharedPreferences進行讀寫設置。 我有時會注意到,一旦服務寫入SharedPreferences,所有設置都會被清除。但它不會每次都發生。

任何想法? 我意識到SharedPreferences不應該被不同的進程使用,但它可以在所有智能手機上正常工作!

+0

最後一句:活動和服務都運行在相同的過程。它們只是同一應用程序的不同組件。 –

+0

我注意到SharedPreferences也在某些手機上被刪除。我一直無法確定100%是什麼原因造成的。但我只是轉而使用新的數據存儲模式作爲潛在的修補程序。 – FoamyGuy

+0

@mice:你確定嗎?因爲在LogCat中他們有不同的PID(進程ID) – almisoft

回答

2

SharedPreferences通常效果很好,正如你所提到的,在智能手機上沒有任何問題。它也應該在平板電腦上工作。然而,最好是使用sqlite或支持你的服務器上的共享首選項每個用戶ID數據丟失是一個問題。

+0

非常感謝您的快速回復。但這只是一個解決方法。並且它不適用於我的PreferenceActivity,因爲此活動僅適用於SharedPreferences ... – almisoft

19

我發現設置消失的原因: 如果兩個進程向SharedPreferences寫入數據,則可能會發生所有SharedPreferences都重置爲默認值的情況。 在我的情況下,當服務將第一個數據寫入SharedPreferences時,會清除所有設置。

現在,該服務僅提供對SharedPreferences的讀訪問權限。兩個進程寫入的設置都存儲在數據庫中。

+0

它解決了問題嗎?你沒有標記它.. –

+0

刪除訪問服務共享首選項後,我發現問題已解決 – vallllll

3

我有同樣的問題。 如果有一個值偶爾用key = null寫入,則共享首選項的所有值都將成爲默認值。當你使用Eclipse創建新的常量時這是可能的,默認情況下它們默認爲null,然後你忘記了去到類的開始並將常量改爲一些有意義的值。 如果您繼續使用該應用,則讀取共享首選項的操作將返回有效值。 但是當上下文發生變化時(例如,當活動被android終止並重新創建時),共享首選項中的所有值將返回默認值(零)。

因此,請檢查您的共享首選項的密鑰! 我希望這個答案能幫助別人。