Android SharedPreferences的使用

SharedPreferences是Android中存储数据的一种方式,它简单快捷,通常用于纪录一些配置设置信息,用起来非常爽。但也有不爽的地方就是要记录的东西多了就很乱。最近在整理项目代码的时候就发现了这个问题。先不扯淡,先温习总结一下SP的用法。

Android中得到SharedPrefernces方法的方法有三种。分别是:ContextgetSharedPreferences(String name, int mode)ActivitygetPreferences(int mode)PreferenceManager.getDefaultSharedPreferences(Context context);文章先介绍SharedPreferences的基本用法,然后在介绍三种方法的区别。

SharedPreferences的基本用法

先通过Context.getSharedPreferences(String name, int mode)方法来得到的SharedPreferences为例介绍。为什么用这个方法,因为我比较喜欢这个方法,它可以让我们自己指定SP的名字。用这个方法生成的SP有一种亲儿子的感觉。

上关键代码:

1
2
3
4
5
SharedPreferences diySP = getSharedPreferences("diy",MODE_PRIVATE) ;
diySP.edit()
.putString("name",editTextName.getText().toString())
.putString("age", editTextAge.getText().toString())
.apply();

editTextNameeditTextAge是两个EditText。当我在里面分别输入Tony,32之后执行上面代码。
我们通过DDMS查看在我们项目的目录下shared_prefs目录下增加了一个diy.xmldiy是我上面起的名字。把它拷贝到电脑,其中内容如下,当然很多时候age是int值,那就进行一下类型转化,使用putInt方法就可以了:

1
2
3
4
5
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="name">Tony</string>
<string name="age">32</string>
</map>

通过生成的文件可以看出,SharedPreferences实际的结构是一个map,通过key-value的方式存储的。理解这一点就很简单了。

从SharedPreferences中取值的方法就是:

1
2
String name = diySP.getString("name","") ;
String age = diySP.getString("age","0") ;

这样我们就可以存储一些简单的配置信息,在应用下次启动的时候继续使用这些配置。

如果必要的时候需要清除这些信息可以使用:

1
diySP.edit().clear().apply();

所配置的信息就会被清除。

如果有必要的话,需要监听一个配置信息是不是有改变,就可以使用OnSharedPreferenceChangeListener接口,然后使用SP的registerOnSharedPreferenceChangeListener方法注册一个变化监听器。

但是这个并不是很常用。代码也十分简单,我就不演示了。

三种方法得到SharedPreferences的区别

Context的方法

ContextgetSharedPreferences(String name, int mode)上面的介绍过了,名字是我们指定的。

Activity的方法

而通过ActivitygetPreferences(int mode)方法创建得到的SharePreferences的文件名称是:{Activity's local name}.xml,这是我从DDMS看的,有兴趣的人也可以自己去看看。{Activity's local name}是Activity的本地名字,即包涵本地包名的名字。例如我的PSActivity的完整包名:demo.me.mydemoapplication.sp.PSActivity,我的项目包名为:demo.me.mydemoapplication,那么Activity的本地名称为:sp.PSActivity,而生成的SP的xml文件名为:sp.SPActivity.xml。另一种方法进入ActivitygetPreferences(int mode)的源码:

1
2
3
public SharedPreferences getPreferences(int mode) {
return getSharedPreferences(getLocalClassName(), mode);
}

它最终调用的Context的getSharedPreferences方法传入的名称为这个类的本地名称。

PreferenceManager的方法

PreferenceManager.getDefaultSharedPreferences(Context context)方法得到的SP的文件名称为:{app_package}_preferences.xml;这个是以应用包名命名的SP。源码感兴趣的可以自己去看。最终还是使用的Context的方法。