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();
}
}