0Pricing
Android Academy · 课时

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. Kotlin 集合
  2. RecyclerView 基础
  3. RecyclerView 点击事件
  4. SharedPreferences
  5. DataStore 偏好设置
  6. 适配器与 DiffUtil
← 返回 Android Academy