SharedPreferences
以键值对的形式存储数据,支持几种基本数据类型:boolean、float、int、long、String
,一般存储配置信息。它保存的数据时持久化的,即使应用被关掉也不会丢失。存储格式为.xml
,一般放在内部存储中。获取SharedPreferences
对象主要有三种方式:
方法 | 调用者 | 命名 | 允许存在个数 |
---|---|---|---|
getSharedPreferences (String name, int mode) | Activity、Context | 以当前Activity命名 | 一个Activity只能存在一个 |
getPreferences (int mode) | Activity | 自定义文件名 | 可以存在多个 |
static getDefaultSharedPreferences(Context Context) | PreferenceManager | 包名 + _preferences | 一个应用程序只有一个 |
常用的操作模式有三种:
MODE_PRIVATE
只有当前应用可以对SharedPreferences文件进行读写MODE_WORLD_READABLE
获取一个可读的对象MODE_WORLD_WRITEABLE
获取一个可写的对象
一次完整的写入数据操作需要执行三个步骤:
- 获取
SharedPreferences
对象,调用该对象的edit()
方法,得到一个SharedPreferences.Editor
对象 putBoolean()
或者putString()
等方法添加键值对数据commit()
或者apply()
保存数据到本地
可以看到最终保存数据时有两个方法可以调用,这两个方法区别在于:
apply()
没有返回值,而commit()
返回boolean
表明数据保存是否成功 。apply()
同步提交数据到内存(这部分操作属于原子操作,也就是不可被中断的操作), 接着异步提交到本地,而commit()
是同步提交到本地。因此,如果有多个commit()
同时提交时,他们只能依次执行,从而降低了效率。而apply()
只是的提交到内存,后面的apply()
会直接覆盖前面的内存数据,从而提高了效率。
官方比较推荐使用apply()
:If you don’t care about the return value and you’re using this from your application’s main thread, consider using apply() instead.
SharedPreferences
的操作比较简单,这里直接给出相关的工具类:
public class SPUtils {
/**
* 保存在手机里面的文件名
*/
public static final String FILE_NAME = "share_data";
/**
* 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法
*/
public static void put(Context context, String key, Object object) {
SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
if (object instanceof String) {
editor.putString(key, (String) object);
} else if (object instanceof Integer) {
editor.putInt(key, (Integer) object);
} else if (object instanceof Boolean) {
editor.putBoolean(key, (Boolean) object);
} else if (object instanceof Float) {
editor.putFloat(key, (Float) object);
} else if (object instanceof Long) {
editor.putLong(key, (Long) object);
} else {
editor.putString(key, object.toString());
}
editor.apply();
}
/**
* 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值
*/
public static Object get(Context context, String key, Object defaultObject) {
SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
if (defaultObject instanceof String) {
return sp.getString(key, (String) defaultObject);
} else if (defaultObject instanceof Integer) {
return sp.getInt(key, (Integer) defaultObject);
} else if (defaultObject instanceof Boolean) {
return sp.getBoolean(key, (Boolean) defaultObject);
} else if (defaultObject instanceof Float) {
return sp.getFloat(key, (Float) defaultObject);
} else if (defaultObject instanceof Long) {
return sp.getLong(key, (Long) defaultObject);
}
return null;
}
/**
* 移除某个key值已经对应的值
*/
public static void remove(Context context, String key) {
SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.remove(key);
editor.apply();
}
/**
* 清除所有数据
*/
public static void clear(Context context) {
SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.clear();
editor.apply();
}
/**
* 查询某个key是否已经存在
*/
public static boolean contains(Context context, String key) {
SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
return sp.contains(key);
}
/**
* 返回所有的键值对
*/
public static Map<String, ?> getAll(Context context) {
SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
return sp.getAll();
}
}