Android的SharedPreferences用来存储一些键值对, 可是却不支持跨进程使用.
跨进程来用的话, 固然是放在数据库更可靠啦, 本文主要是给做者的新库PreferencesProvider打个广告.
这是一个用ContentProvider实现的, 能够像SharedPreferences同样用于存储键值对, 支持跨进程使用.html
SharedPreferences对多进程的支持很差, 你用什么mode也没用, 因此官方已经废弃了原先的MODE_MULTI_PROCESS, 而且建议跨进程存取值仍是用ContentProvider之类的更靠谱一些.
说明见:
Context#MODE_MULTI_PROCESSandroid
以前项目中为了解决跨进程存取值的问题, 找了一个解决方案: 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同样的库, 更简单, 造福其余人, 那么何乐而不为呢.模块化
生成ContentProvider相关代码:
BoD/android-contentprovider-generator
只要定义数据库基本信息, 在json中定义表结构, 就能够生成全部相关代码.工具
查看数据库:
Stetho
在Chrome中像调试网页同样看Android应用的资源, 这个真是太好用了.调试
最后再次附上本文推荐的解决方案库: PreferencesProvider