在android的使用过程中,本地缓存数据有多种方式,其中有一种方式用于保存key-value的数据形式,那就是 — SharedPreferences。
下面我们就来详细解读一下SharedPreferences的使用。
创建SharedPreferences有三种方式:
1.Activity.getPreferences(Mode)
2.Context.getSharedPreferences(name,mode)
3.通过PreferencesManager来获取
下面我们就来依次讲解一下,通过每一种方式来获取SharedPreferences的区别:
在讲怎么创建SharedPreferences之前,我们来看一看每一种创建方式中都有mode参数,我们就先来对这个mode参数做一个详解;mode是Context中的静态常量,有4种
1.MODE_PRIVATE 文件存在每一次对文件的操作,都会对文件进行覆盖,否则创建新文件。
2.MODE_APPEND 如果文件存在,则会往文件中追加记录,否则创建新文件(常用)
3.MODE_WORLD_READABLE
4.MODE_WORLD_WRITEABLE
从API 17开始MODE_WORLD_READABLE、MODE_WORLD_WRITEABLE已经被注释了,不建议使用。如果要共享文件,可以通过ContentProvider的方式来实现。
好了,讲解了Mode之后,我们来看看每一种创建SharedPreferences的区别。
一、Activity.getPreferences(mode)
通过Activity.getPreferences()的方式来获取SharedPreferences很简单,只需要在Activity中调用
SharedPreferences preferences = getPreferences(MODE_APPEND);
创建过后,我们往其中存放数据。
// 往apreferences存放数据
SharedPreferences.Editor editor1 = apreferences.edit();
editor1.putString("key", "apreferences");
editor1.putString("mode", "append");
editor1.commit(); // 提交数据
记住一定要commit();否则将没法将数据放入文件中。
我们在Main.Activity和Test.Activity中分别通过上面的方式来创建和保存数据,然后进入文件目录,查看创建的SharedPreferences目录文件(/data/data/<包名>/shared_prefs/)
我们会发现,创建了两个文件,并且分别以Activity的名称来作为的文件名。并且进一步实验会发现在MainActivity中插入的数据,在TestActivity中通过Activity.getPreferences的方式创建的SharedPreferences无法获取到数据。
我们追踪源代码,会发现,其实通过Activity.getPreferences()的方式来创建SharedPreferences还是调用的Context.getSharedPreferences来创建的SharedPreferences。
public SharedPreferences getPreferences(int mode) {
return getSharedPreferences(getLocalClassName(), mode);
}
</pre><pre name="code" class="java"><pre name="code" class="java">@Override
public SharedPreferences getSharedPreferences(String name, int mode) {
return mBase.getSharedPreferences(name, mode);
}
只是通过Activity的方式来创建的时候,文件名是调用的getLocalClassName()传递的。
下面具体来看看getLocalClassName()方法,为了方便理解,我把Activity里的getLocalClassName()复制出来,加上注释和日志:
public String getLocalClassName() {
// 获取包名
final String pkg = getPackageName();
Log.i("TAG", "pkg --> " + pkg);
// 获取当前类的名称[包括包名]
final String cls = getIntent().getComponent().getClassName();
Log.i("TAG", "cls --> " + cls);
int packageLen = pkg.length();
if (!cls.startsWith(pkg) || cls.length() <= packageLen
|| cls.charAt(packageLen) != '.') {
return cls;
}
return cls.substring(packageLen+1);
}
我们可以看到系统是通过包名和类名来构建的,因为同一个包下不可能出现重复名称的Activity,所以这样能保证,每一个Activity能够对应一个SharedPreferences。
在实际中一般都不会通过Activity的方式来创建SharedPreferences,我们一般都是通过Context的方式来创建SharedPreferences的,下面我们就来看看通过Context的方式来获取SharedPreferences。
二、Context.getSharedPreferences()
了解了上面的过后,下面的就比较简单了,直接看代码:
// 获取SharedPreferences
cpreferences1 = getSharedPreferences("test", MODE_APPEND);
// 插入数据
SharedPreferences.Editor editor = cpreferences1.edit();
editor.putString("key", "key");
editor.putString("value", "value");
editor.commit(); // 提交
通过Context的方式创建的preferences文件,在本应用的其它地方只要传入的文件名相同,都能获取到。
这个也是最常用的方式。
三、PreferencesManager
通过PreferencesManager来获取SharedPreferences很简单。
// 通过PreferenceManager获取
cpreferences2 = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor2 = cpreferences2.edit();
editor2.putString("key", "key");
editor2.putString("value", "value");
editor2.commit();
这样,就已经存放了数据了,我们看看存放的文件名
可以看到文件名是:com.gavin.preferences_preferences.xml。接下来,我们通过源代码来看看文件名的构成方式。
public static SharedPreferences getDefaultSharedPreferences(Context context) {
return context.getSharedPreferences(getDefaultSharedPreferencesName(context),
getDefaultSharedPreferencesMode());
}
private static String getDefaultSharedPreferencesName(Context context) {
return context.getPackageName() + "_preferences";
}
可以看到,PreferencesManager中是通过获取应用包名然后拼接上 “_preferences” 来作为为配置文件名。