做軟件開發應該都知道,很多軟件會有配置文件,里面存放這程序運行當中的各個屬性值,由於其配置信息並不多,如果采用數據庫來存放並不划算,因為數據庫連接跟操作等耗時大大影響了程序的效率,因此我們使用鍵值這種一一對應的關系來存放這些配置信息。SharedPreferences正是Android中用於實現這中存儲方式的技術。
SharedPreferences的使用非常簡單,能夠輕松的存放數據和讀取數據。SharedPreferences只能保存簡單類型的數據,例如,String、int等。一般會將復雜類型的數據轉換成Base64編碼,然后將轉換后的數據以字符串的形式保存在 XML文件中,再用SharedPreferences保存。
(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,如果存在則打開它,否則創建新的Preferences
SharedPreferences settings = getSharedPreferences(“setting”, 0);
2、讓setting處於編輯狀態
SharedPreferences.Editor editor = settings.edit();
3、存放數據
editor.putString(“name”,”ATAAW”);
editor.putString(“URL”,”ATAAW.COM”);
4、完成提交
editor.commit();
B、讀取數據信息
1、獲取Preferences
SharedPreferences settings = getSharedPreferences(“setting”, 0);
2、取出數據
String name = settings.getString(“name”,”默認值”);
String url = setting.getString(“URL”,”default”);
以上就是Android中SharedPreferences的使用方法,其中創建的Preferences文件存放位置可以在Eclipse中查看:
DDMS->File Explorer /<package name>/shared_prefs/setting.xml
主要代碼 具體如下(僅供參考):
在onCreate方法中調用restorePrefs()方法:
//讀取 功能的實現
private void restorePrefs() {
// TODO Auto-generated method stub
//SharedPreferences是一種輕量級的數據存儲方式.是以鍵值對來存儲應用程序的
//配置信息的一種方式,它只能存儲基本數據類型。
//聲明一個優先級設置 類型 settings,載入配置文件
SharedPreferences settings = getPreferences(BMI.MODE_PRIVATE);
//使用getXXX函數從優先級設置讀取不同類型的內容 得到優先級設置參數的內容
String pref_height = settings.getString(PREF_HEIGHT, "");
//此一句為喚醒記憶語句
field_height.setText(pref_height);
field_weight.requestFocus();//設置焦點字段 到“體重”字段上 用戶只需直接輸入體重數字就可以了
}
//存儲 在Activity每次變暗,也就是離開當前屏幕時,記住設置的身高值 即 存儲優先級設置
protected void onPause()
{
super.onPause();
Log.v("BMI", "onPause1");
//獲得SharedPreferences對象
SharedPreferences settings = getPreferences(BMI.MODE_PRIVATE);
//獲得SharedPreferences.Editor
SharedPreferences.Editor editor = settings.edit();
//保存組件的值 為優先級設置填寫不同類型的內容
//用"field_height"界面組件標識符來取得身高的字符串 然后保存到PREF_HEIGHT所代表的優先級設置參數中
editor.putString(PREF_HEIGHT, field_height.getText().toString());
//提交保存的結果 將改變寫到系統中
editor.commit();
}
————————————————————————————————————————————————————————————————————————
在使用SharedPreferences時常用的方法包括(方法具體含義參考官方文檔):
[mw_shl_code=java,true]
1.Context.getSharedPreferences (String name, int mode)
2.Activity.getPreferences (int mode)
3.SharedPreferences.edit();
4.SharedPreferences.getXXX(name, defaultValue);
5.SharedPreferences.Editor.putXXX(name, value);
6.SharedPreferences.Editor.commit();
[/mw_shl_code]
步驟:
保存數據
[mw_shl_code=java,true]Log.d("SharedPreferences", "保存數據...");
//獲得SharedPreferences對象
SharedPreferences settings = this.getSharedPreferences("shared_file", 0);
//獲得可編輯對象
SharedPreferences.Editor editor = settings.edit();
editor.putString("name", "Kael Chen");
editor.putInt("age", 22);
editor.commit();
Log.d("SharedPreferences", "保存數據成功");[/mw_shl_code]
讀取數據
[mw_shl_code=java,true]Log.d("SharedPreferences", "獲取數據...");
SharedPreferences settings = this.getSharedPreferences("shared_file", 0);
String name = settings.getString("name", "no name");
int age = settings.getInt("age", 0);
Log.d("SharedPreferences", "name:" + name + ", age:" + age);
Log.d("SharedPreferences", "獲取數據成功");[/mw_shl_code]
執行代碼后,可以看到在data/data/pacakge name/shared_prefs/目錄下多了一個shared_file.xml文件,文件名是由getSharedPreferences方法中傳入的參數決定的。
文件內容如下:
[mw_shl_code=java,true]<?xml version='1.0' encoding='utf-8' standalone='yes' ?><map><string name="name">Kael Chen</string><int name="age" value="22" /></map>[/mw_shl_code]
可以看到,不同於ini文件的是,這里是嚴格區分了數據的類型的,所以在getXXX和putXXX相同數據時使用的類型一定要匹配。
--------------------------------------------------------------------------------
另外值得注意的是getSharedPreferences 方法中的mode參數以及getPreferences和getSharedPreferences 的區別。
getPreferences和getSharedPreferences的區別:
1、getPreferences只能由Activity調用,只在調用它的Activity范圍內有效。
2、getSharedPreferences是由Context調用,在包范圍內有效。可以這樣理解,AndroidManifest.xml文件中定義了包的位置,比如我的測試程序中定義的包為cn.kael.sample,那么android會建立data/data/cn.kael.sample/shared_prefs/的目錄,並在其下產生SharePreferences文件。因此如果已經在一個地方使用了SharedPrefernces,並創建了相應的SharedPrefernces文件,然后你想在另一個地方使用該SharedPrefernces文件,你只需要根據文件的路徑規則判斷在新的地方使用SharedPrefernces生成的路徑是不是和之前SharedPrefernces文件的路徑一致,就可以知道兩者之間是否能夠共用SharedPrefernces,即使它們不屬於同一個應用程序(因為android是根據包名來決定SharedPrefernces文件的創建位置的,和應用程序名無關)。
關於mode參數:
要想在程序B想訪問程序A的SharedPrefernces文件:
首先需要程序A在創建SharedPrefernces時使用MODE_WORLD_WRITEABLE或者MODE_WORLD_READABLE作為mode參數:
[mw_shl_code=java,true]SharedPreferences settings = this.getSharedPreferences("shared_file", Context.MODE_WORLD_WRITEABLE);[/mw_shl_code]
然后在程序B中需要先創建程序A的context對象,然后再通過這個context對象來調用getSharedPreferences方法:
[mw_shl_code=java,true]Context contextA = createPackageContext("cn.kael.sample", Context.CONTEXT_IGNORE_SECURITY);SharedPreferences settings = contextA.getSharedPreferences( "shared_file", Context.MODE_WORLD_WRITEABLE);[/mw_shl_code]