简介
SharePreference
用于保存相对较小的键值对数据。
常用于 保存登录信息,引导页状态,设置信息(是否开启通知)状态等。需要注意信息的安全性,不要存储敏感信息,比如用户的账号密码。
- 基础使用
- 1.1 声明
sharedPreference
对象 - 1.2 存入数据
- 1.3 取出数据
- 1.4 删除数据
- 1.1 声明
- 如何查看
SharePreference
保存的文件呢? - 注意事项
- 总结
- 常见面试题
- 资料
基础使用
1.1 声明 sharedPreference
对象
//在 Context 中使用 , 需要传入文件名
val sp = activity?.getSharedPreferences(
"spFileName", Context.MODE_PRIVATE)
//在 Activity 中使用,会默认生成一个和当前 Activity 相关的文件名
val sp = activity?.getPreferences(Context.MODE_PRIVATE)
一般使用 Context 的方式来获取 sharedPreference
对象**
第二个参数是什么意思呢?
@IntDef(flag = true, prefix = { "MODE_" }, value = {
MODE_PRIVATE,//私有文件
MODE_WORLD_READABLE,//可读文件
MODE_WORLD_WRITEABLE,//可读文件
MODE_MULTI_PROCESS,//多进程模式
})
@Retention(RetentionPolicy.SOURCE)
public @interface PreferencesMode {}
目前只有 MODE_PRIVATE 是可用的,其他都弃用了。
**MODE_WORLD_READABLE ,MODE_WORLD_WRITEABLE ** 被 FileProvider 代替
**MODE_MULTI_PROCESS ** 在某些Android版本中不可靠地工作,并且没有提供任何机制来协调跨进程的并发修改。应用程序不应尝试使用它。相反,他们应该使用显式的跨进程数据管理方法,例如 ContentProvider.
1.2 存储数据
2种提交方式
//同步提交,会同步写入磁盘,在需要等待结果的场景可以使用
//避免在主线程调用,它可能会导致页面卡顿
sp.edit().putString(key, value).commit()
//异步提交,会先更新到内存,然后异步存储到磁盘
sp.edit().putString(key, value).apply()
存储数据的类型
String
Int
Boolean
Float
Long
StringSet
1.3 取出数据
//没有存储值的情况下,会返回 defValue
sp.getString(key,defValue)
1.4 删除数据
//清空所有数据
sp.edit().clear()
//移除指定Key的数据
sp.edit().remove(String s)
如何查看 SharePreference
保存的文件呢?
使用 Android Studio 的 Device File Explorer
/data/data/APP包名/shared_prefs/文件名.xml
注意事项
- 不支持多进程
- 不要用明文存储敏感信息,安全性低
- 不要存放大的 key 和 value ,会增加卡顿的风险
- 不同业务的 key 可以存放在不同文件下,减少文件大小。
文件越大,卡顿发生的几率越高
- 合并提交内容,可以同时提交多个改动,共用一次 apply()
sp 是全量更新的,合并提交可以减少修改的次数
- 尽量不要存放复杂的 json 文件
有遇到过缓存整个 list 的 json 存在 sp 文件
总结
SharePreference
适合保存相对较小的键值对数据,不支持多进程。严重时会导致 ANR,注意不要存储大数据。如果需要支持多进程,请使用 DataStore
, 目前 DataStore
基本可以完全取代 SharePreference
。所以这篇文章也是记录 SharePreference
从入门到放弃!
常见面试题
1. commit() 和 apply() 的区别?
2. sharePreference 如何支持多进程?
3. sharePreference 为什么会导致 ANR?
4. 如何解决 sharePreference 的 ANR 问题?