SharedPreferences簡介
在Android開發過程中,有時候我們需要儲存一些簡單的軟體配置等簡單資料的資訊,而如果我們直接用資料庫儲存的話又不太方便,在這裡我們就可以用到SharedPreferences,SharedPreferences儲存的資料主要是類似於配置資訊格式的資料,因此儲存的資料主要是簡單類型的索引值對(key-value),它儲存的是一個XML檔案。
SharedPreferences常用的屬性和方法
方法名稱 |
描述 |
public abstract boolean contains (String key) |
判斷SharedPreferences是否包含特定key的資料 |
public abstract SharedPreferences.Editor edit () |
返回一個Edit對象用於操作SharedPreferences |
public abstract Map<String, ?> getAll () |
擷取SharedPreferences資料裡全部的key-value對 |
getXXX(String key,XXX defvlaue) |
擷取SharedPreferences資料指定key所對應的value,如果該key不存在,返回預設值defValue。其中XXX可以是boolean、float、int、long、String等基本類型的值 |
由於SharedPreference是一個介面,而且在這個介面裡並沒有提供寫入資料和讀取資料的能力。但是在其內部有一個Editor內部的介面,Edit這個介面有一系列的方法用於操作SharedPreference。
Editor介面的常用方法
方法名稱 |
描述 |
public abstract SharedPreferences.Editor clear () |
清空SharedPreferences裡所有的資料 |
public abstract boolean commit () |
當Editor編輯完成後,調用該方法可以提交修改,而且必須要調用這個資料才修改 |
public abstract SharedPreferences.Editor putXXX (String key, boolean XXX) |
向SharedPreferences存入指定的key對應的資料,其中XXX可以是boolean、float、int、long、String等基本類型的值 |
public abstract SharedPreferences.Editor remove (String key) |
刪除SharedPreferences裡指定key對應的資料項目 |
SharedPreferences是一個介面,程式是無法建立SharedPreferences執行個體的,可以通過Context.getSharedPreferences(String name.int mode)來得到一個SharedPreferences執行個體
name:是指檔案名稱,不需要加尾碼.xml,系統會自動為我們添加上。一般這個檔案儲存體在/data/data/<package name>/shared_prefs下(這個面試常問到)
mode:是指定讀寫方式,其值有三種,分別為:
Context.MODE_PRIVATE:指定該SharedPreferences資料只能被本應用程式讀、寫
Context.MODE_WORLD_READABLE:指定該SharedPreferences資料能被其他應用程式讀,但不能寫
Context.MODE_WORLD_WRITEABLE:指定該SharedPreferences資料能被其他應用程式讀寫。
執行個體:用SharedPreferences進行簡單的操作
package com.jiahui.preferences;import android.app.Activity;import android.content.SharedPreferences;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;public class SharedPreferencesDemoActivity extends Activity {private SharedPreferences sharedPreferences;private SharedPreferences.Editor editor;public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);sharedPreferences = this.getSharedPreferences("test",MODE_WORLD_READABLE);editor = sharedPreferences.edit();final EditText edtName = (EditText) this.findViewById(R.id.edtName);final EditText edtAge = (EditText) this.findViewById(R.id.edtAge);Button btnRead = (Button) this.findViewById(R.id.btnRead);Button btnWrite = (Button) this.findViewById(R.id.btnWrite);btnRead.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 如果沒有這個key就以預設值String name = sharedPreferences.getString("name", null);int age = sharedPreferences.getInt("age", 0);edtAge.setText(String.valueOf(age));edtName.setText(name);}});btnWrite.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String name = edtName.getText().toString();int age = Integer.parseInt(edtAge.getText().toString());editor.putInt("age", age);editor.putString("name", name);// 一定要提交editor.commit();}});}}
實現效果:
用File Explorer可以查看在data/data/com.jiahui.preferences/shared_prefs/下多了一個XML檔案
將XML檔案匯出我們可以看到在這個XML檔案裡儲存了以下內容:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?><map><int name="age" value="20" /><string name="name">jiahui</string></map>
讀寫其他應用SharedPreferences
在有時的開發過程中,我們可能要訪問其他的應用程式的SharedPreferences,要實現這樣的功能,我們必須要保證要訪問的那個應用程式的SharedPreferences的存取權限要是MODE_WORLD_READABLE,這表明該SharedPreferences可以被其他應用程式讀取,如果指定的MODE_WORLD_WRITEABLE表明該SharedPreferences可以被其他應用程式讀取寫入其實現思路如下
1、 獲得其他應用程式對應的Context
2、 通過這個Context得到這個應用程式的SharedPreferences,然後再利用這個SharedPreferences讀取內容
以上一例的SharedPreference為例。實現代碼:
package com.jiahui.preferences2;import android.app.Activity;import android.content.Context;import android.content.SharedPreferences;import android.content.pm.PackageManager.NameNotFoundException;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;public class SharedPreferencesDemo02Activity extends Activity {private Button btnRead;private EditText edtResult;Context otherContext;public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);try {// 擷取其他應用程式的ContextotherContext = createPackageContext("com.jiahui.preferences",CONTEXT_IGNORE_SECURITY);} catch (NameNotFoundException e) {e.printStackTrace();}edtResult = (EditText) this.findViewById(R.id.edtResult);btnRead = (Button) this.findViewById(R.id.btnRead);btnRead.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 擷取其他應用程式的SharedPreferencesSharedPreferences preferences = otherContext.getSharedPreferences("test",Context.MODE_WORLD_READABLE);String name = preferences.getString("name", null);int age = preferences.getInt("age", 0);edtResult.setText("訪問的結果為:姓名:" + name + "年齡:" + age);}});}}
實現效果:
SharedPreferences的注意事項:
編輯完SharedPreferences一定要記得調用Editor的commit()方法,否則不會將資料寫入到檔案裡的。
回顧總結:
1、 如何得到SharedPreferences
SharedPreferences preferences=getPreferences(“test”,MODE_PRIVATE);
2、 如何編輯SharedPreferences
得到Editor對象執行個體
SharedPreferences.Editor editor=preferences.editor();
3、 SharedPreferences的儲存位置
/data/data/<package name>/shared_prefs
如需轉載引用請註明出處:http://blog.csdn.net/jiahui524