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