android SharedPreferences详解

在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/)

《android SharedPreferences详解》

我们会发现,创建了两个文件,并且分别以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();

这样,就已经存放了数据了,我们看看存放的文件名

《android SharedPreferences详解》

可以看到文件名是: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” 来作为为配置文件名。

    原文作者:爱在彩虹
    原文地址: https://blog.csdn.net/u011113654/article/details/50635678
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞