SharedPreferences
一種key-value的儲存模式
最簡單的方式使用getPreferences(),取得當前默認Activity的Preference。
// 在Activity中使用getPreferences
val sharedPref = getPreferences(Context.MODE_PRIVATE)
// 或者 在Fragment使用
val sharedPref = activity.getPreferences(Context.MODE_PRIVATE)
基本上參數都用Context.MODE_PRIVATE,
其他參數MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE有安全性漏洞不建議使用,
因為讓外界App能夠隨意存取既不合理又危險!
指定Preferences
基本上就是Preferences會儲存成不同的名稱 "指定名稱.xml",
可以讓。
val sharedPref = getSharedPreferences(指定名稱, Context.MODE_PRIVATE)
寫入
然後讀寫的getPreferences都一樣,
寫入需要edit(),然後範例我用的是putString用來存字串。
除了字串型態外,還有Boolean, Float, Int, Long, StringSet。
呼叫的方法名稱跟putString一樣,型態前面加put。(Ex: putInt(Key值, Int值))
然後最後就跟Fragment的Transaction結尾一樣都要commit(),
但無特殊需求建議都用apply()。
commit()和apply() 主要差異是同步和異步寫入,
commit()會將資料直接寫入慢速I/O(SD卡or ROM);
apply()則是將資料暫存,系統會自動在認為適合的時間內寫入慢速I/O。
fun saveMessage(msg: String) {
val sharedPref = getPreferences(Context.MODE_PRIVATE)
val editor = sharedPref.edit()
// putString(string_key , string_value)
sharedPref.edit().apply{
// ...更多的put方法
putString(getString(R.string.saved_message), msg)
editor.apply() // 或 editor.commit()
}
}
讀取
讀取preferences內儲存的字串,就用getString(key值, 如果沒有正確取得就回傳的字串)
對應寫入的方法有getBoolean(),getInt()等等的取值方法。
fun readMessage(): String {
val sharedPref = getPreferences(Context.MODE_PRIVATE)
val defaultString = "No saved message"
return sharedPref.getString(getString(R.string.saved_message), defaultString)
}
參考資料
https://developer.android.com/reference/android/content/SharedPreferences.html