SharedPreferences是使用鍵值對(duì)的方式來存儲(chǔ)數(shù)據(jù)的。Android中得到SharedPrefernces方法的方法有以下三種:
1.Context的getSharedPreferences(String name, int mode)
钥屈。
name為文件的名稱,如果指定的文件不存在則會(huì)創(chuàng)建一個(gè),文件都是存放在/data/data/<package name:="">/shared prefs目錄下的抖棘。mode指定操作模式歇由,目前只有MODE_PRIVATE這一種模式可選场航,也是默認(rèn)的操作模式萍肆,與直接傳入0效果是相同的袍榆,表示只有當(dāng)前的應(yīng)用程序才可以對(duì)這個(gè)指定文件進(jìn)行讀寫。其他幾種操作模式均已被廢棄匾鸥,MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE已在Android 4.2中被廢棄的蜡塌,MODE_MULTI_PROCESS在Android 6.0中被廢棄碉纳。</package>
2.Activity類的getPreferences(int mode)
勿负。
這個(gè)方法會(huì)自動(dòng)將當(dāng)前活動(dòng)類名作為文件名,只接收一個(gè)操作模式參數(shù)劳曹。
3.РrеfеrеnсеМаnаgеr類的PreferenceManager.getDefaultSharedPreferences(Context context)
這是一個(gè)靜態(tài)方法奴愉,將應(yīng)用程序的包名作為前綴來命名文件名,接收一個(gè)Context 參數(shù)铁孵。
基本使用:
1.保存數(shù)據(jù)
SharedPreferences.Editor editor = getSharedPreferences("name",MODE_PRIVATE).edit();
editor.putString("userName","Tom");
editor.putInt("age",21);
editor.putBoolean("married",false);
editor.apply();
2.讀取數(shù)據(jù)
SharedPreferences sharedPreferences = getSharedPreferences("name",MODE_PRIVATE);
sharedPreferences.getString("userName","");
sharedPreferences.getInt("age",0);
sharedPreferences.getBoolean("married",false);
流程圖:
sp 中幾種文件創(chuàng)建模式:
- MODE_PRIVATE
默認(rèn)的模式锭硼,當(dāng)前創(chuàng)建的文件只能被當(dāng)前 Application 使用。
2.MODE_WORLD_READABLE
讀模式蜕劝,允許其他應(yīng)用程序讀取該文件檀头,在 Android N 之后會(huì)有一個(gè) SecurityException 異常。@Deprecated
3.MODE_WORLD_WRITEABLE
寫模式岖沛,允許其他應(yīng)用程序?qū)懭朐撐募钍迹?Android N 之后會(huì)有一個(gè) SecurityException 異常。@Deprecated
4.MODE_MULTI_PROCESS
多進(jìn)程模式婴削,這種模式是不安全的廊镜,官方不建議使用,可以使用 ContentProvider 來代替唉俗。當(dāng)設(shè)置MODE_MULTI_PROCESS模式, 則每次getSharedPreferences過程, 會(huì)檢查SP文件上次修改時(shí)間和文件大小, 一旦所有修改則會(huì)重新從磁盤加載文件嗤朴。@Deprecated
SharedPreference提交的commit與apply的區(qū)別
這兩個(gè)方法的區(qū)別在于:
- apply沒有返回值而commit返回boolean表明修改是否提交成功
- apply是將修改數(shù)據(jù)原子提交到內(nèi)存, 而后異步真正提交到硬件磁盤, 而commit是同步的提交到硬件磁盤,因此虫溜,在多個(gè)并發(fā)的提交commit的時(shí)候雹姊,他們會(huì)等待正在處理的commit保存到磁盤后在操作,從而降低了效率衡楞。而apply只是原子的提交到內(nèi)容吱雏,后面有調(diào)用apply的函數(shù)的將會(huì)直接覆蓋前面的內(nèi)存數(shù)據(jù),這樣從一定程度上提高了很多效率。
- apply方法不會(huì)提示任何失敗的提示坎背。
由于在一個(gè)進(jìn)程中替劈,sharedPreference是單實(shí)例,一般不會(huì)出現(xiàn)并發(fā)沖突得滤,如果對(duì)提交的結(jié)果不關(guān)心的話陨献,建議使用apply,當(dāng)然需要確保提交成功且有后續(xù)操作的話懂更,還是需要用commit的眨业。
SharedPreferences 工具類:
/**
* spName :為文件名
* key 值 通過key得到value
*
*
* Commit: 在當(dāng)前線程中 立即提交 寫入到文件中
*
* Apply:也可以提交數(shù)據(jù) 不會(huì)占用主線程。會(huì)創(chuàng)建子線程在后臺(tái)將內(nèi)容寫入到SD 卡中沮协。
*/
public class MvpSpUtils {
//創(chuàng)建一個(gè)sp 的文件
private static final String DEFAULT_SP_NAME = "mvp_sp_config";
//定義一個(gè)16進(jìn)制的變量
private static final int TYPE_COMMIT = 0X100;
private static final int TYPE_APPLY = 0X101;
//創(chuàng)建靜態(tài)的 方法 返回值為String 的方法 包含一個(gè)參數(shù) key 通過key得到value
public static String getString(String key){
return getString(DEFAULT_SP_NAME, key);
}
//創(chuàng)建靜態(tài)的方法 返回值為String 的方法 包含二個(gè)參數(shù) key spName 通過key得到value
public static String getString(String spName,String key){
return MvpManager.getContext().getSharedPreferences(spName, Context.MODE_PRIVATE).getString(key,null);
}
//創(chuàng)建靜態(tài)的 方法 返回值為long 的方法 包含一個(gè)參數(shù) key 通過key得到value
public static long getLong(String key){
return getLong(DEFAULT_SP_NAME, key);
}
//創(chuàng)建靜態(tài)的方法 返回值為long 的方法 包含二個(gè)參數(shù) key spName 通過key得到value
public static long getLong(String spName,String key){
return MvpManager.getContext().getSharedPreferences(spName,Context.MODE_PRIVATE).getLong(key,0);
}
//刪除 key 清除文件
public static void remove(String key){
remove(DEFAULT_SP_NAME,key);
}
//刪除 key 將spName 文件清除
public static void remove(String spName,String key){
SharedPreferences preferences = MvpManager.getContext().getSharedPreferences(spName,Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.remove(key);
editor.commit();
}
public static void saveCommit(String key, Object value){
saveString(DEFAULT_SP_NAME,key,value,TYPE_COMMIT);
}
public static void saveCommit(String spName, String key, Object value){
saveString(spName,key,value,TYPE_COMMIT);
}
public static void saveApply(String spName, String key, Object value){
saveString(spName,key,value,TYPE_APPLY);
}
public static void saveApply(String key, Object value){
saveString(DEFAULT_SP_NAME,key,value,TYPE_APPLY);
}
//保存文件 將key value 保存在以spName 的文件中 龄捡,
private static void saveString(String spName,String key,Object value,int type){
SharedPreferences preferences = MvpManager.getContext().getSharedPreferences(spName,Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
//但是遇到不同的情況可以進(jìn)行判斷
if(value instanceof String){
editor.putString(key,value.toString());
}else if(value instanceof Float){
editor.putFloat(key, (Float) value);
}else if(value instanceof Integer){
editor.putInt(key, (Integer) value);
}else if(value instanceof Boolean){
editor.putBoolean(key, (Boolean) value);
}else if(value instanceof Long){
editor.putLong(key, (Long) value);
}
//如果是type_apply 就以apply 提交數(shù)據(jù) 否則相反
if(type == TYPE_APPLY){
editor.apply();
}else{
editor.commit();
}
}
}