使用SharedPreferences
使用SharedPreferences
有些時(shí)候,應(yīng)用程序有少量的數(shù)據(jù)需要保存,而且這些數(shù)據(jù)的格式很簡(jiǎn)單:都是普通的字符串、標(biāo)量類型的值等,比如應(yīng)用程序的各種配置信息(如是否打開音效、是否使用振動(dòng)效果等)、小游戲的玩家積分(如掃雷英雄榜之類的)等,對(duì)于這種數(shù)據(jù),Android提供了SharedPreferences進(jìn)行保存。
SharedPreferences與Editor簡(jiǎn)介
SharedPreferences保存的數(shù)據(jù)主要是類似于配置信息格式的數(shù)據(jù),因此它保存的數(shù)據(jù)主要是簡(jiǎn)單類型的key-value對(duì)。
SharedPreferences接口主要負(fù)責(zé)讀取應(yīng)用程序的Preferences數(shù)據(jù),它提供了如下常用方法來(lái)訪問(wèn)SharedPreferences中的key-value對(duì)。
- boolean contains(String key):判斷SharedPreferences是否包含特定key的數(shù)據(jù)。
- abstract Map(String, ?) getAll():獲取SharedPreferences數(shù)據(jù)里全部的key-value對(duì)。
- boolean getXxx(String key, xxx defValue):獲取SharedPreferences數(shù)據(jù)里指定key對(duì)應(yīng)的value。如果該key不存在,返回默認(rèn)值defValue。其中xxx可以是boolean、float、int、long、String等各種基本類型的值。
SharedPreferences接口本身并沒(méi)有提供寫入數(shù)據(jù)的能力,而是通過(guò)SharedPreferences的內(nèi)部接口,SharedPreferences調(diào)用edit()方法即可獲取它所對(duì)應(yīng)的Editor對(duì)象。Editor提供了如下方法來(lái)向SharedPreferences寫入數(shù)據(jù)。
- SharedPreferences.Editor clear():清空SharedPreferences里所有數(shù)據(jù)。
- SharedPreferences.Editor putXxx(String key, xxx value):向SharedPreferences存入指定key對(duì)應(yīng)的數(shù)據(jù)。其中xxx可以是boolean、float、int、long、String等各種基本類型的值。
- SharedPreferences.Editor remove(String key):刪除SharedPreferences里指定key對(duì)應(yīng)的數(shù)據(jù)項(xiàng)。
- boolean commit():當(dāng)Editor編輯完成后,調(diào)用該方法提交修改。
SharedPreferences本身是一個(gè)接口,程序無(wú)法直接創(chuàng)建SharedPreferences實(shí)例,只能通過(guò)Context提供的getSharedPreferences(String name, int mode)方法來(lái)獲取SharedPreferences實(shí)例,該方法的第二個(gè)參數(shù)支持如下幾個(gè)值。
- Context.MODE_PRIVATE:指定該SharedPreferences數(shù)據(jù)只能被本應(yīng)用程序讀、寫。
- Context.MODE_WORLD_READABLE:指定該SharedPreferences數(shù)據(jù)能被其他應(yīng)用程序讀,但不能寫。
- Context.MODE_WORLD_WRITEABLE:指定該SharedPreferences數(shù)據(jù)能被其他應(yīng)用程序讀、寫。
SharedPreferences的存儲(chǔ)位置和格式
下面程序示范了如何向SharedPreferences中寫入、讀取數(shù)據(jù),該程序的界面很簡(jiǎn)單,它只是提供了兩個(gè)按鈕,其中一個(gè)用于寫入數(shù)據(jù),另外一個(gè)用于讀取數(shù)據(jù),故此處不再給出界面布局文件。程序代碼如下。
public class MainActivity extends Activity {SharedPreferences preferences;SharedPreferences.Editor editor;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 獲取只能被本應(yīng)用程序讀、寫的SharedPreferences對(duì)象preferences = getSharedPreferences("zong", MODE_PRIVATE);editor = preferences.edit();Button read = (Button) findViewById(R.id.read);Button write = (Button) findViewById(R.id.write);read.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 讀取字符串?dāng)?shù)據(jù)String time = preferences.getString("time", null);// 讀取int類型的數(shù)據(jù)int randNum = preferences.getInt("random", 0);String result = time == null ? "您暫時(shí)還未寫入數(shù)據(jù)": "寫入時(shí)間為:" + time+ "\n上次生成的隨機(jī)數(shù)為:" + randNum;// 使用Toast提示信息Toast.makeText(MainActivity.this, result, Toast.LENGTH_LONG).show();}});write.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 " + "hh:mm:ss");// 存入當(dāng)前時(shí)間editor.putString("time", sdf.format(new Date()));// 存入一個(gè)隨機(jī)數(shù)editor.putInt("random", (int) (Math.random() * 100));// 提交所有存入的數(shù)據(jù)editor.commit();}});}}實(shí)例代碼下載
SharedPreferences數(shù)據(jù)總是保存在/data/data//shared_prefs目錄下,SharedPreferences數(shù)據(jù)總是以XML格式保存。通過(guò)File Explorer面板的導(dǎo)出文件按鈕將該XML文件導(dǎo)出到XML文檔,打開該XML文檔可看到如下文件內(nèi)容:
從上面的文件不難看出,SharedPreferences數(shù)據(jù)文件是一個(gè)根元素為
實(shí)例:記錄應(yīng)用程序的使用次數(shù)
這個(gè)簡(jiǎn)單的示例可以記住應(yīng)用程序的使用次數(shù):當(dāng)用戶第一次啟動(dòng)該應(yīng)用程序時(shí),系統(tǒng)創(chuàng)建SharedPreferences來(lái)記錄使用次數(shù)。用戶以后啟動(dòng)應(yīng)用程序時(shí),系統(tǒng)先讀取SharedPreferences中記錄的使用次數(shù),然后將使用次數(shù)加1。
本示例程序的代碼如下。
public class MainActivity extends Activity {SharedPreferences preferences;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);preferences = getSharedPreferences("count", MODE_WORLD_READABLE);// 讀取SharedPreferences里的count數(shù)據(jù)int count = preferences.getInt("count", 0);// 顯示程序以前使用的次數(shù)Toast.makeText(this, "程序以前被使用了" + count + "次。", Toast.LENGTH_LONG).show();SharedPreferences.Editor editor = preferences.edit();// 存入數(shù)據(jù)editor.putInt("count", ++count);// 提交修改editor.commit();}}示例代碼下載
讀、寫其他應(yīng)用SharedPreferences
要讀、寫其他應(yīng)用的SharedPreferences,前提是創(chuàng)建該SharedPreferences的應(yīng)用程序指定相應(yīng)的訪問(wèn)權(quán)限,例如指定了MODE_WORLD_READABLE,這表明該SharedPreferences可被其他應(yīng)用程序讀取;指定了MODE_WORLD_WRITABLE,這表明該SharedPreferences可被其他程序?qū)懭搿?/p>
例如上一個(gè)示例創(chuàng)建SharedPreferences時(shí)就指定了MODE_WORLD_READABLE模式,這表明該SharedPreferences數(shù)據(jù)可以被其他程序讀取。
為了讀取其他程序的SharedPreferences,可按如下步驟進(jìn)行。
1. 需要?jiǎng)?chuàng)建其他程序?qū)?yīng)的Context,例如如下代碼。
上面的程序中tk.zongzhankui.io就是其他程序的包名——實(shí)際上Android系統(tǒng)就是用應(yīng)用程序的包名來(lái)作為該程序的標(biāo)識(shí)的。
2. 調(diào)用其他程序的Context的getSharedPreferences(String name, int mode)即可獲取相應(yīng)的SharedPreferences對(duì)象。
3. 如果需要向其他應(yīng)用的SharedPreferences數(shù)據(jù)寫入數(shù)據(jù),調(diào)用SharedPreferences的edit()方法獲取相應(yīng)的Editor即可。
下面的程序示范如何讀取上一個(gè)程序所保存的SharedPreferences數(shù)據(jù)。
public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Context useCount = null;try {// 獲取其他程序所對(duì)應(yīng)的ContextuseCount = createPackageContext("tk.zongzhankui.usecount", Context.CONTEXT_IGNORE_SECURITY);} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();}// 使用其他程序的Context獲取對(duì)應(yīng)的SharedPreferencesSharedPreferences prefs = useCount.getSharedPreferences("count", Context.MODE_WORLD_READABLE);// 讀取數(shù)據(jù)int count = prefs.getInt("count", 0);TextView show = (TextView) findViewById(R.id.show);// 顯示讀取的數(shù)據(jù)內(nèi)容show.setText("UseCount應(yīng)用程序以前被使用了" + count + "次。");}}實(shí)例代碼下載
事實(shí)上,如果開發(fā)者不通過(guò)先獲取其他應(yīng)用程序的Context,再獲取SharedPreferences的方式也可讀取SharedPreferences的數(shù)據(jù)——開發(fā)者完全使用以IO流的方式先讀取SharedPreferences對(duì)應(yīng)的XML文件,再通過(guò)XML解析來(lái)獲取數(shù)據(jù)也是可行的,只是這種方式過(guò)去煩瑣,而使用SharedPreferences來(lái)讀寫數(shù)據(jù)則簡(jiǎn)單得多。
轉(zhuǎn)載于:https://www.cnblogs.com/zongzhankui/p/5875323.html
總結(jié)
以上是生活随笔為你收集整理的使用SharedPreferences的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Android应用的基本组件介绍
- 下一篇: 10个最佳 Javascript+HTM