【邊做項目邊學Android】知識點:SharedPreferences

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.