前言
在项目中经常会用到SharedPreferences来存储一些配置信息,比如用户的账号信息等。但是当项目大了之后如果还在要使用时再单独创建和使用SharedPreferences就会造成SharedPreferences泛滥,不好管理,代码可维护性差。因此结合实际的项目经验给出一个通用的SharedPreferences管理类,把项目中所有使用到的SharedPreferences统一管理,同时简化SharedPreferences的使用流程。
SharedPreferences简介
1、原理
SharedPreferences使用xml格式为Android应用提供一种永久的数据存贮方式,并且是使用键值对的方式来存储数据的。对于一个Android应用,它存贮在文件系统的/data/data/app_package_name/shared_prefs/目录下,可以被处在同一个应用中的所有Activity 访问。
因为SharedPreferences本身是一个接口,程序无法直接创建SharedPreferences的实例,只能通过Context提供的
getSharedPreferences(String name,int mode)
方法来获取SharedPreferences的实例:
public abstract SharedPreferences getSharedPreferences(String name,int mode)
此方法接收两个参数,第一个参数用于指定SharedPreferences文件的名称(格式为xml文件),如果指定的文件不存在则会创建一个。第二个参数用于指定操作模式:
MODE_PRIVATE:默认操作模式,和直接传0效果相同,表示只有当前应用程序才可以对这个SharedPreferences文件进行读写
MODE_WORLD_READABLE:指定此SharedPreferences对其他程序只读且无法修改。
MODE_WORLD_WRITEABLE:指定此SharedPreferences能被其他程序读写。
2、实例
SharedPreferences 的使用也很简单,主要分为三步,1、获取SharedPreferences 的实例2、通过Editor 往SharedPreferences 中存数据。3、获取SharedPreferences 中的数据。
//1private SharedPreferences sp=context.getApplicationContext().getSharedPreferences(name, Context.MODE_PRIVATE);//获取SharedPreferences实例//2Editor editor = sp.edit();editor.putString(\"msg\", \"hello world\");editor.commit();//通过editor存储数据//3sp.getString(\"msg\", \"\");//获取存储的数据
SharedPreferences管理类实现
由上面SharedPreferences的用法可知,每一个SharedPreferences都有一个名字,SharedPreferences里面存的内容是通过key-value形式的。要把项目中所有的SharedPreferences管理起来,又可以通过名字获取相应的SharedPreferences,可以通过HashMap作为数据结构来存储SharedPreferences。如下图:
但是如果在HashMap中只存储SharedPreferences那么获取到SharedPreferences后又要进行各种读写操作,所以可以考虑把这些操作和SharedPreferences封装在一起放到hashMap中保存。如下图:
使用HashMap来存储项目中用到的所有SharedPreferences的封装类,并且通过SharedPreferences的名称来查找和操作。
定义一个SharedPreferencesManager类。
1、类变量
public class SharedPreferencesManager {private static final String DEFAULT_SHARED_PREFERENCE = \"DEFAULT_SHARED_PREFERENCE\";//默认名称private static HashMap<String, SharedPreferencesManager> preferenceManagerHashMap = new HashMap<>();//存储项目中的SharedPreferences。private SharedPreferences sharedPreference;private SharedPreferences.Editor editor;//和当前SharedPreferences相关,用于操作SharedPreferences数据......}
在SharedPreferencesManager中定义了DEFAULT_SHARED_PREFERENCE用于表示未命名的默认的SharedPreferences,preferenceManagerHashMap 用来存储项目中使用到的SharedPreferences封装类SharedPreferencesManager,并且可以通过SharedPreferences名字查找到。
2、生成SharedPreferences封装类SharedPreferencesManager并存到HashMap中
private static SharedPreferencesManager getSharedPreferenceManager(Context context, String sharedPreferenceName) {if (preferenceManagerHashMap == null) preferenceManagerHashMap = new HashMap<>();// 如果preferenceManagerHashMap 为null就新建一个String name = TextUtils.isEmpty(sharedPreferenceName) ? DEFAULT_SHARED_PREFERENCE : sharedPreferenceName;SharedPreferencesManager sharedPreferencesManager = preferenceManagerHashMap.get(name);if (sharedPreferencesManager == null) {sharedPreferencesManager = new SharedPreferencesManager(context, name);preferenceManagerHashMap.put(name, sharedPreferencesManager);}return sharedPreferencesManager;}
getSharedPreferenceManager中通过判断当前name是否存在对应的sharedPreferencesManager如果没有就生成一个sharedPreferencesManager并且存放到preferenceManagerHashMap中。
3、sharedPreferencesManager的构造函数
private SharedPreferencesManager(Context context, String name) {sharedPreference = context.getApplicationContext().getSharedPreferences(name, Context.MODE_PRIVATE);//获取sharedPreferenceeditor = sharedPreference.edit();//生成editor}
在sharedPreferencesManager的构造函数中生成了sharedPreference和editor用于操作数据。
4、存放数据和读取数据
存放数据,通过构造方法里面生成的editor来进行数据的存放,putValue里面做了类型判断。
public SharedPreferencesManager putValue(String key, Object value) {if (value instanceof Integer) {editor.putInt(key, (Integer) value);} else if (value instanceof Boolean) {editor.putBoolean(key, (Boolean) value);} else if (value instanceof Float) {editor.putFloat(key, (Float) value);} else if (value instanceof String) {editor.putString(key, (String) value);} else if (value instanceof Long) {editor.putLong(key, (Long) value);} else {String json = gson.toJson(value);editor.putString(key, json);}editor.commit();return this;}
读取数据
public <T> T getValue(String key, Class<T> type) {if (type == Integer.class) {Integer value = sharedPreference.getInt(key, 0);return (T) value;} else if (type == Boolean.class) {Boolean value = sharedPreference.getBoolean(key, false);return (T) value;} else if (type == Float.class) {Float value = sharedPreference.getFloat(key, 0);return (T) value;} else if (type == String.class) {String value = sharedPreference.getString(key, \"\");return (T) value;} else if (type == Long.class) {Long value = sharedPreference.getLong(key, 0);return (T) value;} else {String json = sharedPreference.getString(key, \"\");if (TextUtils.isEmpty(json)) {return null;} else {T value = gson.fromJson(json, type);return value;}}}
5、SharedPreferencesManager初始化
前面已经定义了方法数据和读取数据的方法,下面给SharedPreferencesManager初始化,初始化一次生成项目中要用到的所有SharedPreferences实例。
public static synchronized void init(Context context, boolean createDefaultPreference, String... names) {if (createDefaultPreference) {getSharedPreferenceManager(context, DEFAULT_SHARED_PREFERENCE);}if (names == null || names.length == 0) return;for (String name : names) {getSharedPreferenceManager(context, name);}}
createDefaultPreference表示是否生成默认的SharedPreference,names表示项目中要生成的SharedPreferences的名称。
6、获取SharedPreferencesManager实例
使用单例模式来生成SharedPreferencesManager的实例
//根据name返回实例public static synchronized SharedPreferencesManager getInstance(String name) {SharedPreferencesManager sharedPreferencesManager = preferenceManagerHashMap.get(name);if (sharedPreferencesManager == null)throw new IllegalStateException(\"The share preference: \" + name + \" is not initialized before. You have to initialize it first by calling init(Context, boolean, String...) function\");return sharedPreferencesManager;}/*** 返回默认的SharedPreferencesManager 实例: {@link #DEFAULT_SHARED_PREFERENCE}** @return*/public static synchronized SharedPreferencesManager getInstance() {SharedPreferencesManager sharedPreferencesManager = preferenceManagerHashMap.get(DEFAULT_SHARED_PREFERENCE);if (sharedPreferencesManager == null)throw new IllegalStateException(\"The default share preference is not initialized before. You have to initialize it first by calling init(Context, boolean, String...) function\");return sharedPreferencesManager;}
总结
有了SharedPreferencesManager类之后,就可以在项目中先使用init()方法初始化所有的SharedPreferences,然后调用实例,就可以直接简单的操作了。源码地址:源码地址