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