android SharedPreferences详解

来源:互联网 发布:苏州诺亚网络 编辑:程序博客网 时间:2024/05/16 09:22

在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">@Overridepublic 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()

了解了上面的过后,下面的就比较简单了,直接看代码:

// 获取SharedPreferencescpreferences1 = 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" 来作为为配置文件名。


0 0
原创粉丝点击