Android系统下有一个存储轻量级数据的功能Preference,本质是Setting。Preference翻译过来是偏好,意思是可以通过Preference来根据不同的用户设置自己的偏好,也可以说设置应用或者系统的属性。
Preference用起来方便简单,它主要用来存储应用中的键值对。它包括SharedPreference和PreferenceActivity相关的Preference类。PreferenceActivity相关的Preference类是用于写应用的设置界面,可以很方便的完成设置界面的编写。这篇主要讲它里面的SharedPreference。它的实现是隐藏的系统内部类SharedPreferenceImpl,而SharedPreference仅是接口。
SharedPreferenceImpl在实现键值对存储和读取采用的是二级缓存的方式,首先用static的二级Map存储在内存中,然后以文件的方式存储在/data/data/shared_prefs中。它是以xml文件的形式来存储键值对的。
内存中的二级Map是根据包名和文件名区分的,SharedPreference可以存储基本类型和Set的键值对。
SharedPreference中键值对的读取是同步的,因为中内存中的静态map中读取。写入分为同步和异步之分。SharedPreference的读取是直接使用SharedPreference类下的方法,写入是使用SharedPreference类中的内部类Editor来实现的。Editor有很多put方法用来存储数据到内存,如果提交到本地文件中需要使用commit或者apply方法。其中,commit方法是同步方法,apply是异步方法。因为写入涉及io操作,所以commit会阻塞主线程,推荐使用apply异步的方式提交。
建议SharedPreference文件尽量以文件名命名。在Activity中有getPreference方法来直接获取SharedPreference,它生成的文件以相关的Activity命名。
获取SharedPreference还有一个参数来设置该文件的访问权限,现在的权限仅剩两个,一个是私有权限,一个是多进程权限。