標籤:android sharedpreferences
Ⅰ. 簡介
很多時候我們開發的軟體需要向使用者提供軟體參數設定功能,例如我們常用的 QQ,使用者可以設定是否允許陌生人添加自己為好友。對於軟體配置參數的儲存,如果是window軟體通常我們會採用ini檔案進行儲存,如果是j2se應用,我們會採用properties屬性檔案或者xml進行儲存。如果是Android應用,我們最適合採用什麼方式儲存軟體配置參數呢?Android 平台給我們提供了一個SharedPreferences類,它是一個輕量級的儲存類,特別適合用於儲存軟體配置參數。SharedPreferences 類似過去Windows系統上的ini設定檔,但是它分為多種許可權,可以全域共用訪問,最終是以xml方式來儲存,整體效率來看不是特別的高,對於常規的輕量級而言比SQLite要好不少,如果真的儲存量不大可以考慮自己定義檔案格式。xml 處理時Dalvik會通過內建底層的本地XML Parser解析,比如XMLpull方式,這樣對於記憶體資源佔用比較好。
使用 SharedPreferences儲存資料,其背後是用xml檔案存放資料,檔案存放在/data/data/<package name>/shared_prefs目錄下(需要使用者的root許可權)
SharedPreferences的使用非常簡單,能夠輕鬆的存放資料和讀取資料。SharedPreferences只能儲存簡單類型的資料,例如,String、int等。一般會將複雜類型的資料轉換成Base64編碼,然後將轉換後的資料以字串的形式儲存在 XML檔案中,再用SharedPreferences儲存。這種方式應該是用起來最簡單的Android讀寫外部資料的方法了。他的用法基本上和 J2SE(java.util.prefs.Preferences)中的用法一樣,以一種簡單、透明的方式來儲存一些使用者個人化的字型、顏色、位置等參數資訊。一般的應用程式都會提供“設定”或者“喜好設定”的這樣的介面,那麼這些設定最後就可以 通過Preferences來儲存,而程式員不需要知道它到底以什麼形式儲存的,儲存在了什麼地方。當然,如果你願意儲存其他的東西,也沒有什麼限制。只 是在效能上不知道會有什麼問題。
Ⅱ. 使用
使用SharedPreferences儲存key-value對的步驟如下:
(1)使用Activity類的getSharedPreferences方法獲得SharedPreferences對象,其中儲存key-value的檔案的名稱由getSharedPreferences方法的第一個參數指定。
(2)使用SharedPreferences介面的edit獲得SharedPreferences.Editor對象。
(3)通過SharedPreferences.Editor介面的putXxx方法儲存key-value對。其中Xxx表示不同的資料類型。例如:字串類型的value需要用putString方法。
(4)通過SharedPreferences.Editor介面的commit方法儲存key-value對。commit方法相當於資料庫事務中的提交(commit)操作。
具體代碼的書寫流程為:
A、存放資料資訊
//1、開啟Preferences,名稱為setting,如果存在則開啟它,否則建立新的PreferencesSharedPreferences settings = getSharedPreferences(“setting”, 0);//2、讓setting處於編輯狀態SharedPreferences.Editor editor = settings.edit();//3、存放資料editor.putString(“name”,”ATAAW”);editor.putString(“URL”,”ATAAW.COM”);//4、完成提交editor.commit();
因為SharedPreferences背後是使用xml檔案儲存資料,getSharedPreferences(name,mode)方法的第一個參數用於指定該檔案的名稱,名稱不用帶尾碼,尾碼會由Android自動加上。方法的第二個參數指定檔案的操作模式,共有四種操作模式。
- Activity.MODE_PRIVATE,//預設操作模式,代表該檔案是私人資料,只能被應用本身訪問,在該模式下,寫入的內容會覆蓋原檔案的內容,如果想把新寫入的內容追加到原檔案中,可以使用Activity.MODE_APPEND
- Activity.MODE_WORLD_READABLE,//表示當前檔案可以被其他應用讀取,
- Activity.MODE_WORLD_WRITEABLE,//表示當前檔案可以被其他應用寫入;
//如果希望檔案被其他應用讀和寫,可以傳入:Activity.MODE_WORLD_READABLE+Activity.MODE_WORLD_WRITEABLE
- Activity.MODE_APPEND//該模式會檢查檔案是否存在,存在就往檔案追加內容,否則就建立新檔案
如果希望SharedPreferences背後使用的xml檔案能被其他應用讀和寫,可以指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE許可權。
另外Activity還提供了另一個getPreferences(mode)方法操作SharedPreferences,這個方法預設使用當前類不帶包名的類名作為檔案的名稱。
B、讀取資料資訊
//1、擷取PreferencesSharedPreferences settings = getSharedPreferences(“setting”, 0);//2、取出資料String name = settings.getString(“name”,”預設值”);//getString()第二個參數為預設值,如果preference中不存在該key,將返回預設值String url = setting.getString(“URL”,”default”);
//以上就是Android中SharedPreferences的使用方法,其中建立的Preferences檔案存放位置可以在Eclipse中查看:
DDMS->File Explorer /<package name>/shared_prefs/setting.xml
運行機制Context內部實現
getSharedPreferences()方法本身是Context這個介面中定義的一個抽象方法,由ContextImpl類負責實現。
1 、調用getSharedPreferences()擷取對應的的檔案,該函數實現功能如下:
//Context類待用資料集合,以索引值對儲存了所有讀取該xml檔案後所形成的資料集合private static final HashMap<File, SharedPreferencesImpl> sSharedPrefs = new HashMap<File, SharedPreferencesImpl>(); @Overridepublic SharedPreferences getSharedPreferences(String name, int mode){//其所對應的SharedPreferencesImpl對象 ,該對象已一個HashMap集合儲存了我們對該檔案序列化結果SharedPreferencesImpl sp; File f = getSharedPrefsFile(name); //該包下是否存在對應的檔案,不存在就建立一個 synchronized (sSharedPrefs) { //是否已經讀取過該檔案,是就直接返回該SharedPreferences對象 sp = sSharedPrefs.get(f); if (sp != null && !sp.hasFileChanged()) { //Log.i(TAG, "Returning existing prefs " + name + ": " + sp); return sp; } } //以下為序列化該xml檔案,同時將資料寫到map集合中 Map map = null; if (f.exists() && f.canRead()) { try { str = new FileInputStream(f); map = XmlUtils.readMapXml(str); str.close(); } ... } synchronized (sSharedPrefs) { if (sp != null) { //Log.i(TAG, "Updating existing prefs " + name + " " + sp + ": " + map); sp.replace(map); //更新資料集合 } else { sp = sSharedPrefs.get(f); if (sp == null) { //建立一個SharedPreferencesImpl對象,並且設定其相關屬性 sp = new SharedPreferencesImpl(f, mode, map); sSharedPrefs.put(f, sp); } } return sp; }}
2、 SharedPreferences 不過是個介面,它定義了一些操作xml檔案的方法,其真正實作類別為SharedPreferencesImpl ,該類是ContextIml的內部類,該類如下:
//這種形式我們在分析Context ContextIml時接觸過//SharedPreferences只是一種介面,其真正實作類別是SharedPreferencesImpl類private static final class SharedPreferencesImpl implements SharedPreferences{private Map mMap; //儲存了該檔案序列化結果後的操作, 索引值對形式//通過key值擷取對應的value值public String getString(String key, String defValue) { synchronized (this) { String v = (String)mMap.get(key); return v != null ? v : defValue; } }...//獲得該SharedPreferencesImpl對象對應的Edito類,對資料進行操作public final class EditorImpl implements Editor {private final Map<String, Object> mModified = Maps.newHashMap(); //儲存了對索引值變化的集合}}
參考:
http://blog.csdn.net/wxyyxc1992/article/details/17222841
【邊做項目邊學Android】知識點:SharedPreferences