放一个SP工具类,后期参考用。
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import com.guangsu.messenger.MyApplication;
import java.util.HashMap;
/**
* SharedPreferences的单例模式,支持不同的命名
* 作者:Geofferysun
* 参考:https://juejin.im/post/5b7982b351882542c11b0da3
*/
public class SPSingleton {
private static final String DEFAULT = "default";
private static volatile HashMap<String, SPSingleton> instanceMap = new HashMap<>();
private SharedPreferences sp;
private SharedPreferences.Editor editor;
//是否是执行apply的模式,false表示为commit保存数据
private boolean isApplyMode = false;
private SPSingleton(String name) {
if (DEFAULT.equals(name)) {
sp = PreferenceManager.getDefaultSharedPreferences(MyApplication.getInstance());
} else {
sp = MyApplication.getInstance().getSharedPreferences(name, Context.MODE_PRIVATE);
}
editor = sp.edit();
}
public static SPSingleton pre() {
return pre(DEFAULT);
}
public static SPSingleton pre(String name) {
if (instanceMap.get(name) == null) {
synchronized (SPSingleton.class) {
if (instanceMap.get(name) == null) {
instanceMap.put(name, new SPSingleton(name));
}
}
}
//这里每次get操作时强制将保存模式改为commit的方式
instanceMap.get(name).isApplyMode = false;
return instanceMap.get(name);
}
// 如果用apply模式的话,得要先调用这个方法,
// 然后链式调用后续的存储方法,最后以commit方法结尾
private SPSingleton applyMode() {
isApplyMode = true;
return this;
}
private void commit() {
editor.commit();
}
/**
* 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法
*
* @param key
* @param object
* @return
*/
public SPSingleton put(String key, Object object) {
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 {
if (object != null) {
editor.putString(key, object.toString());
} else {
editor.putString(key, "");
}
}
save();
return this;
}
/**
* 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值
*
* @param key
* @param defaultObject
* @return
*/
public Object get(String key, Object defaultObject) {
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 void delete(String key) {
editor.remove(key);
save();
}
private void save() {
if (isApplyMode) {
editor.apply();
} else {
editor.commit();
}
}
// 测试用法
public static void main(String[] args) {
//保存Sting
SPSingleton.pre().put("stringParam", "保存的是String");
//保存整数
SPSingleton.pre().put("IntValue", 1);
//这个会保存到文件名为"Other"的xml文件中
SPSingleton.pre("other").put("BoolValue", false);
//这会调用apply的模式保存
SPSingleton.pre().applyMode().put("", 1).put("", "").put("", 12).commit();
}
}