SharedPreferences是Android中存儲數(shù)據(jù)的一種方式,它簡單快捷,通常用于紀(jì)錄一些配置設(shè)置信息,用起來非常爽。但也有不爽的地方就是要記錄的東西多了就很亂。最近在整理項目代碼的時候就發(fā)現(xiàn)了這個問題。先不扯淡,先溫習(xí)總結(jié)一下SP的用法。
Android中得到SharedPrefernces方法的方法有三種。分別是:Context滴getSharedPreferences(String name, int mode);Activity滴getPreferences(int mode)和PreferenceManager.getDefaultSharedPreferences(Context context);文章先介紹SharedPreferences的基本用法,然后在介紹三種方法的區(qū)別。
SharedPreferences的基本用法
先通過Context.getSharedPreferences(String name, int mode)方法來得到的SharedPreferences為例介紹。為什么用這個方法,因為我比較喜歡這個方法,它可以讓我們自己指定SP的名字。用這個方法生成的SP有一種親兒子的感覺。
上關(guān)鍵代碼:
SharedPreferences diySP = getSharedPreferences("diy",MODE_PRIVATE) ;
diySP.edit()
.putString("name",editTextName.getText().toString())
.putString("age", editTextAge.getText().toString())
.apply();
editTextName和editTextAge是兩個EditText。當(dāng)我在里面分別輸入Tony,32之后執(zhí)行上面代碼。
我們通過DDMS查看在我們項目的目錄下shared_prefs目錄下增加了一個diy.xml,diy是我上面起的名字。把它拷貝到電腦,其中內(nèi)容如下,當(dāng)然很多時候age是int值,那就進行一下類型轉(zhuǎn)化,使用putInt方法就可以了:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="name">Tony</string>
<string name="age">32</string>
</map>
通過生成的文件可以看出,SharedPreferences實際的結(jié)構(gòu)是一個map,通過key-value的方式存儲的。理解這一點就很簡單了。
從SharedPreferences中取值的方法就是:
String name = diySP.getString("name","") ;
String age = diySP.getString("age","0") ;
這樣我們就可以存儲一些簡單的配置信息,在應(yīng)用下次啟動的時候繼續(xù)使用這些配置。
如果必要的時候需要清除這些信息可以使用:
diySP.edit().clear().apply();
所配置的信息就會被清除。
如果有必要的話,需要監(jiān)聽一個配置信息是不是有改變,就可以使用OnSharedPreferenceChangeListener接口,然后使用SP的registerOnSharedPreferenceChangeListener方法注冊一個變化監(jiān)聽器。
但是這個并不是很常用。代碼也十分簡單,我就不演示了。
三種方法得到SharedPreferences的區(qū)別
Context的方法
Context滴getSharedPreferences(String name, int mode)上面的介紹過了,名字是我們指定的。
Activity的方法
而通過Activity滴getPreferences(int mode)方法創(chuàng)建得到的SharePreferences的文件名稱是:{Activity's local name}.xml,這是我從DDMS看的,有興趣的人也可以自己去看看。{Activity's local name}是Activity的本地名字,即包涵本地包名的名字。例如我的PSActivity的完整包名:demo.me.mydemoapplication.sp.PSActivity,我的項目包名為:demo.me.mydemoapplication,那么Activity的本地名稱為:sp.PSActivity,而生成的SP的xml文件名為:sp.SPActivity.xml。另一種方法進入Activity滴getPreferences(int mode)的源碼:
public SharedPreferences getPreferences(int mode) {
return getSharedPreferences(getLocalClassName(), mode);
}
它最終調(diào)用的Context的getSharedPreferences方法傳入的名稱為這個類的本地名稱。
PreferenceManager的方法
PreferenceManager.getDefaultSharedPreferences(Context context)方法得到的SP的文件名稱為:{app_package}_preferences.xml;這個是以應(yīng)用包名命名的SP。源碼感興趣的可以自己去看。最終還是使用的Context的方法。