SharedPreferences
使用 SharedPreferences 在应用会话之间持久化简单的键值数据。学习如何保存、读取和删除偏好设置。
SharedPreferences 是 CoddyKit 上的免费 Android Academy 课时。 这是第 4 节课,共 6 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Android Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Android Academy 课程共包含 6 节课。
持久化存储选项
Android 提供了多种在本地存储数据的方式:
- SharedPreferences——简单的键值对(设置、令牌)
- Room——结构化的 SQLite 数据库(复杂数据)
- DataStore——SharedPreferences 的现代异步替代方案
- 文件——原始文件输入输出
SharedPreferences 非常适合保存简单设置和用户偏好。
什么是 SharedPreferences?
SharedPreferences 会将数据以键值对的形式存储在设备上的 XML 文件中。它支持:
- String
- Int / Long / Float
- Boolean
- Set<String>
数据会在应用重启后保留,也会在配置更改(旋转屏幕)后保留。
获取 SharedPreferences 实例
获取 SharedPreferences 对象有两种方式:
// 1. Named preferences (shared across activities)
val prefs = getSharedPreferences(
"MyAppPrefs", // file name
Context.MODE_PRIVATE // only your app can read it
)
// 2. Activity's default preferences
val prefs = getPreferences(Context.MODE_PRIVATE)写入数据
使用 Editor 写入值,然后调用 apply():
val prefs = getSharedPreferences("MyAppPrefs", Context.MODE_PRIVATE)
prefs.edit()
.putString("username", "alice")
.putInt("login_count", 5)
.putBoolean("dark_mode", true)
.apply() // async, non-blocking — preferred over commit()
// Kotlin extension (cleaner syntax):
with(prefs.edit()) {
putString("username", "alice")
apply()
}读取数据
根据键读取值;如果键不存在,则提供一个默认值:
val prefs = getSharedPreferences("MyAppPrefs", Context.MODE_PRIVATE)
val username = prefs.getString("username", "Guest") // default: "Guest"
val count = prefs.getInt("login_count", 0) // default: 0
val darkMode = prefs.getBoolean("dark_mode", false) // default: false
println("Hello, $username! Logins: $count. Dark: $darkMode")实践示例:主题切换
保存并恢复深色模式设置:
class SettingsActivity : AppCompatActivity() {
private lateinit var binding: ActivitySettingsBinding
private lateinit var prefs: SharedPreferences
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivitySettingsBinding.inflate(layoutInflater)
setContentView(binding.root)
prefs = getSharedPreferences("settings", MODE_PRIVATE)
// Restore saved state
binding.switchDarkMode.isChecked = prefs.getBoolean("dark_mode", false)
binding.switchDarkMode.setOnCheckedChangeListener { _, isChecked ->
prefs.edit().putBoolean("dark_mode", isChecked).apply()
}
}
}保存登录令牌
在应用重启后保存并检查身份验证令牌:
// Save token after login
fun saveToken(token: String) {
getSharedPreferences("auth", MODE_PRIVATE)
.edit()
.putString("token", token)
.apply()
}
// Check if user is logged in
fun isLoggedIn(): Boolean {
val token = getSharedPreferences("auth", MODE_PRIVATE)
.getString("token", null)
return token != null
}
// Clear on logout
fun logout() {
getSharedPreferences("auth", MODE_PRIVATE)
.edit()
.remove("token")
.apply()
}移除和清除数据
移除指定的键,或清除所有数据:
.remove("key")——删除一条记录.clear()——删除文件中的所有内容
请始终调用 .apply()(如果需要同步确认,则调用 .commit())。
SharedPreferences 与 DataStore
SharedPreferences 虽然使用方便,但存在一些限制:
- 同步读取可能会阻塞主线程
- 不提供类型安全
Jetpack DataStore 是现代替代方案——它基于 Kotlin Flow 完全异步,并提供类型安全。对于新项目,建议优先使用 DataStore。SharedPreferences 仍被广泛使用,用于少量数据时也完全合适。
快速检查
哪个方法可以异步保存数据到 SharedPreferences,而不会阻塞界面线程?
回顾:SharedPreferences
现在,您可以在多次启动应用之间持久化简单数据:
- 使用
getSharedPreferences(name, MODE_PRIVATE)获取 - 写入:
.edit().putString(key, value).apply() - 读取:
.getString(key, defaultValue) - 移除:
.edit().remove(key).apply() - 优先使用
apply()(异步),而不是commit()(同步)
下一门课程:应用架构——ViewModel、Room 和协程。
常见问题解答
「SharedPreferences」课时是免费的吗?
是的 — 「SharedPreferences」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Android Academy 课程的其余内容,请升级到 CoddyKit PRO。 Android Academy 课程共包含 6 节课。
「SharedPreferences」这节课中我会学到什么?
使用 SharedPreferences 在应用会话之间持久化简单的键值数据。学习如何保存、读取和删除偏好设置。 你通过在浏览器中直接运行的动手代码来练习 Android Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Android Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Android Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 6 节。
「SharedPreferences」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Android Academy 课中编写并运行代码吗?
能。每节 Android Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- Kotlin 集合
- RecyclerView 基础
- RecyclerView 点击事件
- SharedPreferences
- DataStore 偏好设置
- 适配器与 DiffUtil