1. 使用support包中SharedPreferencesCompat.apply()方法存储数据,解决apply()在低版本sdk兼容问题
2. 支持针对用户存储,只需修改 SharedPreferences 文件名即可
public class SPUtil {
public static final String KEY_USER_HOBBY_DIALOG = "key_user_hobby_dialog";//用户兴趣对话框
// @Retention 定义策略
// 声明构造器
@StringDef({KEY_USER_HOBBY_DIALOG,})
@Retention(RetentionPolicy.SOURCE)
public @interface SPKey {
}
private static final String USER_SP_PREFIX = "SP_USER_";
public static String userTemp = "userTemp";
/**
* 获取 SharedPreferences
*
* @param inUserSP 是否跟用户相关
* @return SharedPreferences
*/
private static SharedPreferences getSharedPreferences(boolean inUserSP) {
SharedPreferences sharedPreferences;
if (inUserSP) {
String name = USER_SP_PREFIX + userTemp;
sharedPreferences = AppContext.getInstance().getApplicationContext().getSharedPreferences(name, Context.MODE_PRIVATE);
} else {
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(AppContext.getInstance().getApplicationContext());
}
return sharedPreferences;
}
/**
* 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法
*
* @param key key
* @param object value
*/
public static void putDefaultSP(@SPKey String key, Object object) {
put(false, key, object);
}
/**
* 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法
*
* @param key key
* @param object value
*/
@SuppressLint("CommitPrefEdits")
public static void putUserSP(@SPKey String key, Object object) {
put(true, key, object);
}
/**
* 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法
*
* @param inUserSP 是否保存在与用户相关的 SharedPreferences
* @param key key
* @param object value
*/
@SuppressLint("CommitPrefEdits")
private static void put(boolean inUserSP, @SPKey String key, Object object) {
SharedPreferences sp = getSharedPreferences(inUserSP);
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());
}
SharedPreferencesCompat.EditorCompat.getInstance().apply(editor);
}
public static Object getFromDefaultSP(@SPKey String key, Object defaultObject) {
return get(false, key, defaultObject);
}
public static Object getFromUserSP(@SPKey String key, Object defaultObject) {
return get(true, key, defaultObject);
}
/**
* 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值
*
* @param inUserSP 是否从 跟用户相关的SharedPreferences中 取值
* @param key key
* @param defaultObject defaultObject
* @return Object
*/
private static Object get(boolean inUserSP, @SPKey String key, Object defaultObject) {
SharedPreferences sp = getSharedPreferences(inUserSP);
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;
}
public static String getFromDefaultSP(@SPKey String key, String defValue) {
return get(false, key, defValue);
}
public static String getFromUserSP(@SPKey String key, String defValue) {
return get(true, key, defValue);
}
private static String get(boolean inUserSP, @SPKey String key, String defValue) {
SharedPreferences sp = getSharedPreferences(inUserSP);
return sp.getString(key, defValue);
}
/***************************** boolean begin***************************/
public static boolean getFromDefaultSP(@SPKey String key, boolean defValue) {
return get(false, key, defValue);
}
public static boolean getFromUserSP(@SPKey String key, boolean defValue) {
return get(true, key, defValue);
}
private static boolean get(boolean inUserSP, @SPKey String key, boolean defValue) {
SharedPreferences sp = getSharedPreferences(inUserSP);
return sp.getBoolean(key, defValue);
}
/***************************** boolean end***************************/
/***************************** int begin***************************/
public static int getFromDefaultSP(@SPKey String key, int defValue) {
return get(false, key, defValue);
}
public static int getFromUserSP(@SPKey String key, int defValue) {
return get(true, key, defValue);
}
private static int get(boolean inUserSP, @SPKey String key, int defValue) {
SharedPreferences sp = getSharedPreferences(inUserSP);
return sp.getInt(key, defValue);
}
/***************************** int end***************************/
/***************************** float begin***************************/
public static float getFromDefaultSP(String key, float defValue) {
return get(false, key, defValue);
}
public static float getFromUserSP(@SPKey String key, float defValue) {
return get(true, key, defValue);
}
private static float get(boolean inUserSP, @SPKey String key, float defValue) {
SharedPreferences sp = getSharedPreferences(inUserSP);
return sp.getFloat(key, defValue);
}
/***************************** float end***************************/
/***************************** long begin***************************/
public static long getFromDefaultSP(@SPKey String key, long defValue) {
return get(false, key, defValue);
}
public static long getFromUserSP(@SPKey String key, long defValue) {
return get(true, key, defValue);
}
private static long get(boolean inUserSP, @SPKey String key, long defValue) {
SharedPreferences sp = getSharedPreferences(inUserSP);
return sp.getLong(key, defValue);
}
/***************************** long begin***************************/
public static void removeFromDefaultSP(@SPKey String key) {
remove(false, key);
}
public static void removeFromUserSP(@SPKey String key) {
remove(true, key);
}
/**
* 移除某个key值已经对应的值
*
* @param inUserSP inUserSP
* @param key key
*/
@SuppressLint("CommitPrefEdits")
private static void remove(boolean inUserSP, @SPKey String key) {
SharedPreferences sp = getSharedPreferences(inUserSP);
SharedPreferences.Editor editor = sp.edit();
editor.remove(key);
SharedPreferencesCompat.EditorCompat.getInstance().apply(editor);
}
public static void clearDefaultSP() {
clear(false);
}
public static void clearUserSP() {
clear(true);
}
/**
* 清除所有数据
*
* @param inUserSP inUserSPSP
*/
@SuppressLint("CommitPrefEdits")
private static void clear(boolean inUserSP) {
SharedPreferences sp = getSharedPreferences(inUserSP);
SharedPreferences.Editor editor = sp.edit();
editor.clear();
SharedPreferencesCompat.EditorCompat.getInstance().apply(editor);
}
public static boolean containsInDefaultSP(@SPKey String key) {
return contains(false, key);
}
public static boolean containsInUserSP(@SPKey String key) {
return contains(true, key);
}
/**
* 查询某个key是否已经存在
*
* @param inUserSP inUserSP
* @param key key
* @return boolean
*/
private static boolean contains(boolean inUserSP, @SPKey String key) {
SharedPreferences sp = getSharedPreferences(inUserSP);
return sp.contains(key);
}
public static Map<String, ?> getAllFromDefault() {
return getAll(false);
}
public static Map<String, ?> getAllFromUser() {
return getAll(true);
}
/**
* 返回所有的键值对
*
* @param inUserSP inUserSP
* @return Map
*/
private static Map<String, ?> getAll(boolean inUserSP) {
SharedPreferences sp = getSharedPreferences(inUserSP);
return sp.getAll();
}
}