SharedPreferences 是一種輕量化的資料儲存方式,每個 APP 的 SharedPreferences 資料都是各自獨立無法互相存取,當 APP 解除安裝後,資料也會一併刪除。 適合用來儲存簡單輕量的 Key-Value 資料,例如使用者帳號、暱稱、登入時間...等等,複雜格式則建議使用 JSON 檔案或 SQLite 資料庫儲存。 SharedPreferences 支援 Boolean、Float、Int、Long 及 String 等型別,且無需任何權限就可以存取

取得 SharedPreferences

SharedPreferences 使用 XML 檔案來儲存 Key-Value 資料,這個檔案會建立在 Internal Storage 的 /data/data/[Package Name]/shared_prefs 目錄中。 使用前,必需先使用 getSharedPreferences() 或 getPreferences() 取得 SharedPreferences 物件,再進行後續的各項操作,這些操作都是執行緒安全 (Thread safety) 的。

            
                // 方法一
                SharedPreferences sharedPref = getSharedPreferences("FileName", Context.MODE_PRIVATE);

                // 方法二
                SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
            
        

方法一:getSharedPreferences(String name, int mode)

name 參數
為 XML 的檔案名稱,上述行 2 程式碼執行後,將會建立 FileName.xml 檔案,SharedPreferences 實際上就是存取這個檔案中的資料。
mode 參數
設定 SharedPreferences 的操作模式,總共有四種可選模式,分別為 MODE_PRIVATE、MODE_WORLD_READABLE、MODE_WORLD_WRITEABLE 及 MODE_MULTI_PROCESS,除 MODE_PRIVATE 模式以外,其餘都在新的 API 版本中放棄使用了,因此這個欄位可以固定填寫 MODE_PRIVATE 即可。

使用此方法,只要 name 參數一樣,就可以在不同的 Activity 共用同一個 SharedPreferences 資料。

方法二:getPreferences(int mode)

mode 參數
與方法一相同,可以固定填寫 MODE_PRIVATE 即可。

使用此方法,會使用當前 Activity 的 Class 名稱作為 XML 的檔案名稱,因此在不同的 Activity 中,使用 getPreferences() 建立的檔名是不一樣的,所以資料也不會共用。 但這只是被檔名隔開而已,還是可以使用 getSharedPreferences() 來取得其他頁面使用 getPreferences() 建立的資料。

資料操作

以下是 SharedPreferences 常用操作程式碼,提供大家參考。

寫入

                
                    SharedPreferences sharedPref = getSharedPreferences("FileName", Context.MODE_PRIVATE);
                    SharedPreferences.Editor editor = sharedPref.edit();
                    editor.putInt("KEY1", 1);
                    editor.putBoolean("KEY2", true);
                    editor.putFloat("KEY3", 1.0f);
                    editor.putLong("KEY4", 99999);
                    editor.putString("KEY5", "字串");
                    editor.putStringSet("KEY6", new HashSet<>());
                    editor.apply();
                
            
  • 行 9:也可以用 commit()。

讀取

                
                    SharedPreferences sharedPref = getSharedPreferences("FileName", Context.MODE_PRIVATE);
                    int value1 = sharedPref.getInt("KEY1", 0);
                    boolean value2 = sharedPref.getBoolean("KEY2", false);
                    float value3 = sharedPref.getFloat("KEY3", 0.0f);
                    long value4 = sharedPref.getLong("KEY4", 0);
                    String value5 = sharedPref.getString("KEY5", "");
                    Set<String> value6 = sharedPref.getStringSet("KEY6", new HashSet<>());
                
            

刪除

                
                    SharedPreferences sharedPref = getSharedPreferences("FileName", Context.MODE_PRIVATE);
                    SharedPreferences.Editor editor = sharedPref.edit();
                    editor.remove("KEY1");
                    editor.apply();
                
            
  • 行 3:remove() 是刪除特定 Key 的資料,如果要清除全部,可以使用 clear()。
  • 行 4:也可以用 commit()。

apply() VS commit()

SharedPreferences 異動資料後,必需呼叫 apply() 或 commit() 資料才會實際寫入檔案。

apply()
此方法是將要修改的資料提交到記憶體,再使用非同步方法寫入硬碟,因此效率較高,但並不保證資料一定寫入成功。此外,apply() 不會回傳值,執行失敗也不會顯示任何訊息。因此在某些特定情況下,資料並沒有正確寫入到硬碟,開發人員也很難發現此問題。
commit()
此方法會同步將資料寫入硬碟,因此在多執行緒使用時,會互相等待 commit() 執行完成,因此效率較差。此外,commit() 會回傳 boolean 值,表示本次修改是否提交成功,對資料是否正確寫入至硬碟有比較高的保障。