在我们开发Android过程中数据的存储会有很多种解决方案,譬如常见的文件存储、数据库存储、网络云存储等,但是Android系统为咱们提供了更加方便的一种数据存储方式,那就是SharePreference数据存储。其实质也就是文件存储,只不过是符合XML标准的文件存储而已,而且其也是Android中比较常用的简易型数据存储解决方案。
我们在这里不仅要探讨SharePreference如何使用,还要探讨其源码是如何实现的;同时还要在下一篇博客讨论由SharePreference衍生出来的Preference相关Android组件实现,不过有意思的是我前几天在网上看见有人对google的Preference有很大争议,有人说他就是鸡肋,丑而不灵活自定义,有人说他是一个标准,很符合设计思想,至于谁说的有道理,我想看完本文和下一篇文章你自然会有自己的观点看法的,还有一点就是关于使用SharePreference耗时问题也是一个争议,分析完再说吧,那就现在开始分析吧(基于API 22源码)。
【工匠若水 http://blog.csdn.net/yanbober 转载请注明出处。点我开始Android技术交流】
2 SharePreferences基本使用实例
在Android提供的几种数据存储方式中SharePreference属于轻量级的键值存储方式,以XML文件方式保存数据,通常用来存储一些用户行为开关状态等,也就是说SharePreference一般的存储类型都是一些常见的数据类型(PS:当然也可以存储一些复杂对象,不过需要曲线救国,下面会给出存储复杂对象的解决方案的)。
在我们平时应用开发时或多或少都会用到SharePreference,这里就先给出一个常见的使用实例,具体如下:
public class MainActivity extends ActionBarActivity {
private SharedPreferences mSharedPreferences;
private SharedPreferences mSharedPreferencesContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initTest();
}
private void initTest() {
mSharedPreferencesContext = getSharedPreferences(“Test”, MODE_PRIVATE);
mSharedPreferences = getPreferences(MODE_PRIVATE);
SharedPreferences.Editor editor = mSharedPreferencesContext.edit();
editor.putBoolean(“saveed”, true);
Set set = new HashSet<>();
set.add(“aaaaa”);
set.add(“bbbbbbbb”);
editor.putStringSet(“content”, set);
editor.commit();
SharedPreferences.Editor editorActivity = mSharedPreferences.edit();
editorActivity.putString(“name”, “haha”);
editorActivity.commit();
}
}
运行之后adb进入data应用包下的shared_prefs目录可以看见如下结果:
-rw-rw---- u0_a84 u0_a84 108 2015-08-23 10:34 MainActivity.xml
-rw-rw---- u0_a84 u0_a84 214 2015-08-23 10:34 Test.xml
其内容分别如下:
at Test.xml
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>aaaaa
bbbbbbbb
at MainActivity.xml
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>haha
可以看见SharePreference的使用还是非常简单easy的,所以不做太多的使用说明,我们接下来重点依然是关注其实现原理。
【工匠若水 http://blog.csdn.net/yanbober 转载请注明出处。点我开始Android技术交流】
3 SharePreferences源码分析
3-1 从SharePreferences接口说起
其实讲句实话,SharePreference的源码没啥深奥的东东,其实质和ACache类似,都算时比较独立的东东。分析之前我们还是先来看下SharePreference这个类的源码,具体如下:
//你会发现SharedPreferences其实是一个接口而已
public interface SharedPreferences {
//定义一个用于在数据发生改变时调用的监听回调
public interface OnSharedPreferenceChangeListener {
//哪个key对应的值发生变化
void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key);
}
//编辑SharedPreferences对象设定值的接口
public interface Editor {
//一些编辑存储基本数据key-value的接口方法
Editor putString(String key, String value);
Editor putStringSet(String key, Set values);
Editor putInt(String key, int value);
Editor putLong(String key, long value);
Editor putFloat(String key, float value);
Editor putBoolean(String key, boolean value);
//删除指定key的键值对
Editor remove(String key);
//清空所有键值对
Editor clear();
//同步的提交到硬件磁盘
boolean commit();
//将修改数据原子提交到内存,而后异步提交到硬件磁盘
void apply();
}
//获取指定数据
Map<String, ?> getAll();
String getString(String key, String defValue);
Set getStringSet(String key, Set defValues);
int getInt(String key, int defValue);
long getLong(String key, long defValue);
float getFloat(String key, float defValue);
boolean getBoolean(String key, boolean defValue);
boolean contains(String key);
//针对preferences创建一个新的Editor对象,通过它你可以修改preferences里的数据,并且原子化的将这些数据提交回SharedPreferences对象
Editor edit();
//注册一个回调函数,当一个preference发生变化时调用
void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener);
//注销一个之前(注册)的回调函数
void unregisterOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener);
}
很明显的可以看见,SharePreference源码其实是很简单的。既然这里说了SharePreference类只是一个接口,那么他一定有自己的实现类的,怎么办呢?我们继续往下看。
3-2 SharePreferences实现类SharePreferencesImpl分析
我们从上面SharePreference的使用入