Android的SharedPreferences用來存儲一些鍵值對, 但是卻不支持跨進程使用. 跨進程來用的話, 當然是放在資料庫更可靠啦, 本文主要是給作者的新庫[PreferencesProvider](https://github.com/mengdd/PreferencesProvider... ...
Android的SharedPreferences用來存儲一些鍵值對, 但是卻不支持跨進程使用.
跨進程來用的話, 當然是放在資料庫更可靠啦, 本文主要是給作者的新庫PreferencesProvider打個廣告.
這是一個用ContentProvider實現的, 可以像SharedPreferences一樣用於存儲鍵值對, 支持跨進程使用.
SharedPreferences不支持多進程
SharedPreferences對多進程的支持不好, 你用什麼mode也沒用, 所以官方已經廢棄了原先的MODE_MULTI_PROCESS, 並且建議跨進程存取值還是用ContentProvider之類的更靠譜一些.
說明見:
Context#MODE_MULTI_PROCESS
用ContentProvider來取代SharedPreferences 心路歷程
之前項目中為瞭解決跨進程存取值的問題, 找了一個解決方案: grandcentrix/tray, 感覺還挺好用.
我們最後一次用的版本是tray的v0.10.0, 因為項目發佈以後後臺的崩潰里總是有相關的crash, 也是它的一個issue: https://github.com/grandcentrix/tray/issues/50
這個crash不是必現的, 概率比較低, 但是還是影響了一部分用戶, 當我們解決了項目中的其他更重要的crash之後, 這個crash的排名就越來越靠前了.
後來作者做了一些改動, 說是在v0.11.0這個issue將會被修複, 但是這個版本卻遲遲沒有發佈, 似乎作者做了一些很大的改動.
為了及時補救, 不再讓用戶體驗到這個隨機的崩潰, 我們決定放棄等待Tray的下個版本, 自己實現用ContentProvider來存取preferences.
實現過程用了BoD/android-contentprovider-generator來生成ContentProvider相關的代碼.
我們把存preferences的表放在了自己的資料庫里, 然後借鑒了Tray的介面, 封裝了讀取方法, 使之用起來和SharedPreferences類似.
之後我們就用自己寫的新代碼全面取代了Tray, 當然資料庫升級時還需要對原來存在Tray里的重要數據進行遷移.
做完了這些以後, 發現可以做一個像Tray一樣的庫, 更簡單, 造福其他人, 那麼何樂而不為呢.
PreferencesProvider優勢
- 基於ContentProvider實現, 支持跨進程使用;
- 採用模塊化的管理方式, 可以將preferences分組管理;
- 沒有Tray在v0.10.0版本的crash, 因為實現比Tray簡單, 沒有升級等功能.
(其實在我們實際項目的使用中, 基本上用不到對存preferences的表進行資料庫升級的情況). - 使用方式簡單, 見項目README說明:PreferencesProvider.
有用的工具
生成ContentProvider相關代碼:
BoD/android-contentprovider-generator
只要定義資料庫基本信息, 在json中定義表結構, 就可以生成所有相關代碼.
查看資料庫:
Stetho
在Chrome中像調試網頁一樣看Android應用的資源, 這個真是太好用了.
最後再次附上本文推薦的解決方案庫: PreferencesProvider