1. 概述

SharedPreferences 是一种轻量级的数据存储方式,采用键值对的存储方式。

SharedPreferences 只能存储少量数据,大量数据不能使用该方式存储,支持存储的数据类型有 booleans, floats, ints, longs, and strings。

SharedPreferences 存储到一个 XML 文件中的,路径在 /data/data/packagename/shared_prefs/ 下。

存储轻量级的数据,比如设置,非常常用。

2. 基本用法

获取 SharedPreferences 对象

要创建存储文件或访问已有数据,首先要获取 SharedPreferences 才能进行操作。获取 SharedPreferences 对象有下面两个方式:

  • getSharedPreferences(String name, int mode) :通过 Context 调用该方法获得对象。

    • name 指定了 SharedPreferences 存储的文件的文件名
    • mode 指定了操作的模式。
    • 这种方式获取的对象创建的文件可以被整个应用所有组件使用,有指定的文件名。
  • getPreferences(int mode):通过 Activity 调用获得对象。它只有一个参数 mode 指定操作模式。

    • 这种方式获取的对象创建的文件属于 Activity,只能在该 Activity 中使用,且没有指定的文件名,文件名同 Activity 名字。
  • PreferenceManager 类中的 getDefaultSharedPreferences() 方法,静态方法,自动使用当前应用程序包名作为前缀命名文件。

mContextSp = this.getSharedPreferences( "testContextSp", Context.MODE_PRIVATE );
// 创建的文件名是,testContextSp.xml
mActivitySp = this.getPreferences( Context.MODE_PRIVATE );
// 创建的文件名是,MainActivity.xml(该Activity叫MainActivity)

mode

两个方式都有一个 mode 参数,mode 具体有4个值,最新的只能使用默认模式 Context.MODE_PRIVATE。

  • Context.MODE_PRIVATE(0):默认模式,创建的文件只能由调用的应用程序(或者共享相同用户 ID 的应用程序)访问。
  • Context.MODE_WORLD_READABLE(1):别的应用可读
  • Context.MODE_WORLD_WRITEABLE(2):别的应用可写
  • Context.MODE_MULTI_PROCESS(4):跨进程的,不使用

数据更新

SharedPreferences 添加或更新数据,通过 SharedPreferences 获取 SharedPreferences.Editor 操作文件数据,最后通过 commit() 或 apply() 提交修改。

SharedPreferences mContextSp = this.getSharedPreferences("testContextSp", Context.MODE_PRIVATE );
SharedPreferences.Editor editor = mContextSp.edit();
editor.putInt("age", 28);
editor.putBoolean("isStudent", false);
editor.putString("job", "it");
editor.commit();

操作后,在对应应用路径下有创建testContextSp.xml。具体手机里的数据如下。

<?xml version='1.0' encoding='utf-8' ?>
<map>
    <string name="job">it</string>
    <int name="age" value="28" />
    <boolean name="isStudent" value="false" />
</map>

commit() 和 apply() 区别:

apply() 立即更改内存中的 SharedPreferences 对象,但异步地将更新写入磁盘。

commit() 同步地将数据写入磁盘。commit() 是同步的,在主线程调用它应该多注意,因为可能引起阻塞,引起 ANR。

commit() 有返回值,返回是否成功写入永久性存储种。apply() 没有返回值。

数据获取

通过 SharedPreferences 提供的 getInt(), getString() 等方法获取文件中的数据,如果数据不存在,则返回一个默认值。

mContextSp = this.getSharedPreferences("testContextSp", Context.MODE_PRIVATE );
String name = mContextSp.getString("name", "bbb");
int age = mContextSp.getInt("age", 0);
boolean isStudent = mContextSp.getBoolean("isStudent", false);