取代SharedPreferences的多進程解決方案

Android的SharedPreferences用來存儲一些鍵值對, 可是卻不支持跨進程使用.
跨進程來用的話, 固然是放在數據庫更可靠啦, 本文主要是給做者的新庫PreferencesProvider打個廣告.
這是一個用ContentProvider實現的, 能夠像SharedPreferences同樣用於存儲鍵值對, 支持跨進程使用.html

SharedPreferences不支持多進程

SharedPreferences對多進程的支持很差, 你用什麼mode也沒用, 因此官方已經廢棄了原先的MODE_MULTI_PROCESS, 而且建議跨進程存取值仍是用ContentProvider之類的更靠譜一些.
說明見:
Context#MODE_MULTI_PROCESSandroid

用ContentProvider來取代SharedPreferences 心路歷程

以前項目中爲了解決跨進程存取值的問題, 找了一個解決方案: grandcentrix/tray, 感受還挺好用.git

咱們最後一次用的版本是tray的v0.10.0, 由於項目發佈之後後臺的崩潰里老是有相關的crash, 也是它的一個issue: https://github.com/grandcentrix/tray/issues/50
這個crash不是必現的, 機率比較低, 可是仍是影響了一部分用戶, 當咱們解決了項目中的其餘更重要的crash以後, 這個crash的排名就愈來愈靠前了.github

後來做者作了一些改動, 說是在v0.11.0這個issue將會被修復, 可是這個版本卻遲遲沒有發佈, 彷佛做者作了一些很大的改動.數據庫

爲了及時補救, 再也不讓用戶體驗到這個隨機的崩潰, 咱們決定放棄等待Tray的下個版本, 本身實現用ContentProvider來存取preferences.json

實現過程用了BoD/android-contentprovider-generator來生成ContentProvider相關的代碼.
咱們把存preferences的表放在了本身的數據庫裏, 而後借鑑了Tray的接口, 封裝了讀取方法, 使之用起來和SharedPreferences相似.
以後咱們就用本身寫的新代碼全面取代了Tray, 固然數據庫升級時還須要對原來存在Tray裏的重要數據進行遷移.ide

作完了這些之後, 發現能夠作一個像Tray同樣的庫, 更簡單, 造福其餘人, 那麼何樂而不爲呢.模塊化

PreferencesProvider優點

  • 基於ContentProvider實現, 支持跨進程使用;
  • 採用模塊化的管理方式, 能夠將preferences分組管理;
  • 沒有Tray在v0.10.0版本的crash, 由於實現比Tray簡單, 沒有升級等功能.
    (其實在咱們實際項目的使用中, 基本上用不到對存preferences的表進行數據庫升級的狀況).
  • 使用方式簡單, 見項目README說明:PreferencesProvider.

有用的工具

生成ContentProvider相關代碼:
BoD/android-contentprovider-generator
只要定義數據庫基本信息, 在json中定義表結構, 就能夠生成全部相關代碼.工具

查看數據庫:
Stetho
在Chrome中像調試網頁同樣看Android應用的資源, 這個真是太好用了.調試

最後再次附上本文推薦的解決方案庫: PreferencesProvider

相關文章
相關標籤/搜索