1. 程式人生 > >共享記憶體 —— 通過SharedPreferences實現程序間資料共享的問題詳解

共享記憶體 —— 通過SharedPreferences實現程序間資料共享的問題詳解

2015-10-29 10:44

  之前為了解決應用的記憶體壓力,在同一個應用中使用了多程序,但在程式自測的過程中發現不同程序之間的SharedPreferences資料不能共享,但應用內很多資料都是通過SharedPreferences來儲存的,如果改成其它多程序通訊的方式改動比較大。通過檢視原始碼發現,在API Level>=11即Android 3.0可以通過Context.MODE_MULTI_PROCESS屬性來實現SharedPreferences多程序共享,具體使用方式如下:

  1. SharedPreferences sp = context.getSharedPreferences(FILE_NAME,  
  2.              Context.MODE_MULTI_PROCESS);  

SharedPreferences時間程序間資料共享會導致的問題

  本來以為通過MODE_MULTI_PROCESS屬性使用SharedPreferences就可以解決不同程序之間不能共享資料的問題了,但SQA總是反饋一些隨機但出現頻率比較大的bug,比如在使用過程中沒有清除程式資料的前提下,會出現歡迎介面和操作指引,這是通過儲存在SharedPreferences的標誌來判斷使用者是否是第一次啟動程式的,分析發現儲存在SharedPreferences中的資料丟失了,但程式碼中並沒有去清除這些資料,所以推測可能是不同程序同一時間對SharedPreferences操作導致的,經驗證確實如此,去掉多程序就不會再出現這個問題了。

解決方案

  由於程序間是不能記憶體共享的,每個程序操作的SharedPreferences都是一個單獨的例項,上述的問題並不能通過鎖來解決,這導致了多程序間通過SharedPreferences來共享資料是不安全的,這個問題只能通過多程序間其它的通訊方式或者是在確保不會同時操作SharedPreferences資料的前提下使用SharedPreferences來解決。

參考資料

      stackoverflow