在Android开发中,SharedPreferences 是一种轻量级的存储方式,用于保存简单的键值对数据(如是否第一次启动App,是否同意隐私协议)。
在这里我们实现了两个功能:
- ①登录状态缓存
- ②隐私协议确认功能
主要实现代码(PreferenceManager.kt)如下:
kotlin
package com.example.mycalculation.data
import android.content.Context
import android.content.SharedPreferences
class PreferenceManager(context: Context) {
private val sharedPreferences: SharedPreferences =
context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
companion object {
private const val PREF_NAME = "MyCalculationPrefs"
private const val KEY_IS_LOGGED_IN = "isLoggedIn"
private const val KEY_HAS_AGREED_PRIVACY = "hasAgreedPrivacy"
private const val KEY_USERNAME = "currentUsername"
}
/**
* 设置登录状态
*/
fun setLoggedIn(isLoggedIn: Boolean, username: String? = null) {
sharedPreferences.edit().apply {
putBoolean(KEY_IS_LOGGED_IN, isLoggedIn)
putString(KEY_USERNAME, username)
apply()
}
}
/**
* 获取登录状态
*/
fun isLoggedIn(): Boolean {
return sharedPreferences.getBoolean(KEY_IS_LOGGED_IN, false)
}
/**
* 获取当前登录用户名
*/
fun getUsername(): String? {
return sharedPreferences.getString(KEY_USERNAME, null)
}
/**
* 设置隐私协议同意状态
*/
fun setPrivacyAgreed(agreed: Boolean) {
sharedPreferences.edit().putBoolean(KEY_HAS_AGREED_PRIVACY, agreed).apply()
}
/**
* 获取是否同意了隐私协议
*/
fun isPrivacyAgreed(): Boolean {
return sharedPreferences.getBoolean(KEY_HAS_AGREED_PRIVACY, false)
}
/**
* 退出登录,清除状态
*/
fun logout() {
sharedPreferences.edit().apply {
remove(KEY_IS_LOGGED_IN)
remove(KEY_USERNAME)
apply()
}
}
}
一 概述
1. 封装配置管理类 (PreferenceManager.kt)
创建 PreferenceManager 类,用于统一管理应用的持久化配置,主要包括:
| 配置项 | 类型 | 功能说明 |
|---|---|---|
isLoggedIn |
Boolean |
记录用户是否已登录 |
hasAgreedPrivacy |
Boolean |
记录用户是否同意隐私协议 |
currentUsername |
String |
当前登录的用户名 |
示例方法:
kotlin
fun isLoggedIn(): Boolean
fun setLoggedIn(loggedIn: Boolean, username: String)
fun isPrivacyAgreed(): Boolean
fun setPrivacyAgreed(agreed: Boolean)
fun getCurrentUsername(): String?
通过该类可以集中管理所有持久化数据,保证代码整洁和可维护性。
2. 启动页逻辑 (SplashActivity.kt)
启动页主要实现 隐私协议校验 和 自动登录跳转。
2.1 隐私协议校验
- 在 App 启动时,首先判断用户是否已同意隐私协议:
kotlin
if (!preferenceManager.isPrivacyAgreed()) {
showPrivacyDialog() // 弹出不可取消对话框
}
- 弹框行为:
| 操作 | 行为 |
|---|---|
| 点击 同意 | 记录协议同意状态,开始倒计时进入下一步 |
| 点击 拒绝 | 直接退出 App |
2.2 自动登录跳转
- 倒计时结束后,判断用户登录状态:
kotlin
if (preferenceManager.isLoggedIn()) {
startActivity(Intent(this, MainActivity::class.java))
} else {
startActivity(Intent(this, LoginActivity::class.java))
}
finish()
-
逻辑说明:
- 已登录 → 直接进入主页
MainActivity - 未登录 → 跳转至登录页
LoginActivity
- 已登录 → 直接进入主页
3. 登录成功处理 (LoginActivity.kt)
当用户在登录页输入用户名和密码,并通过数据库验证后:
kotlin
preferenceManager.setLoggedIn(true, username)
- 设置用户为已登录状态
- 保存当前用户名
- 下一次启动应用时,
SplashActivity会直接跳转至主页,实现 "只需登录一次" 的体验
4. 流程总结
否
同意
拒绝
是
是
否
App 启动
是否同意隐私协议?
弹出不可取消对话框
开始倒计时
退出 App
是否已登录?
跳转 MainActivity
跳转 LoginActivity
-
优势:
- 配置管理集中,逻辑清晰
- 启动页逻辑明确,用户体验友好
- 支持自动登录,减少重复操作
二 详细讲解
1️⃣ Kotlin 类结构解析
这个类叫 PreferenceManager,是一个管理应用偏好设置(Preferences)的工具类。
kotlin
class PreferenceManager(context: Context)
class声明类。- 构造函数
(context: Context)是主构造函数,传入Context对象,这是 Android 的上下文环境对象,用于访问系统资源(如 SharedPreferences、数据库等)。 PreferenceManager内部用context来获取 SharedPreferences 对象。
2️⃣ SharedPreferences 的概念
SharedPreferences 是 Android 提供的一种轻量级存储方式:
-
用于存储 键值对(key-value)数据。
-
数据存储在 XML 文件 中,保存在应用私有目录里。
-
适合存储:
- 登录状态
- 用户名
- 隐私协议同意状态
- 配置选项
使用 SharedPreferences 的核心流程:
- 获取 SharedPreferences 对象:
kotlin
context.getSharedPreferences(name, mode)
name:存储文件名,自己定义。mode:访问模式,常用Context.MODE_PRIVATE(仅本应用可读写)。
- 编辑 SharedPreferences:
kotlin
sharedPreferences.edit()
- 返回一个
SharedPreferences.Editor对象,用于修改数据。
- 写入数据:
kotlin
putBoolean("key", value)
putString("key", value)
apply() // 异步提交
commit() // 同步提交
- 读取数据:
kotlin
sharedPreferences.getBoolean("key", defaultValue)
sharedPreferences.getString("key", defaultValue)
- 删除数据:
kotlin
remove("key").apply()
3️⃣ 类内部属性
kotlin
private val sharedPreferences: SharedPreferences =
context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
val表示只读属性(类似 final)。sharedPreferences是本类中唯一的 SharedPreferences 实例,用于所有读写操作。PREF_NAME是存储文件名,定义在companion object中。
3.1 companion object
kotlin
companion object {
private const val PREF_NAME = "MyCalculationPrefs"
private const val KEY_IS_LOGGED_IN = "isLoggedIn"
private const val KEY_HAS_AGREED_PRIVACY = "hasAgreedPrivacy"
private const val KEY_USERNAME = "currentUsername"
}
companion object:相当于 Java 的static,里面的变量和方法属于类本身,而不是实例。const val:编译时常量,用于 SharedPreferences 的键,推荐用常量,避免手写字符串错误。
4️⃣ 方法解析
4.1 设置登录状态
kotlin
fun setLoggedIn(isLoggedIn: Boolean, username: String? = null) {
sharedPreferences.edit().apply {
putBoolean(KEY_IS_LOGGED_IN, isLoggedIn)
putString(KEY_USERNAME, username)
apply()
}
}
-
fun定义函数。 -
参数:
isLoggedIn: Boolean→ 登录状态username: String? = null→ 可空参数,默认值为 null
-
sharedPreferences.edit().apply { ... }:edit()返回 Editor 对象apply { ... }是 Kotlin 的 作用域函数 ,在apply内部可以直接调用 Editor 的方法
-
putBoolean/putString写入数据 -
apply()提交(异步)
4.2 获取登录状态
kotlin
fun isLoggedIn(): Boolean {
return sharedPreferences.getBoolean(KEY_IS_LOGGED_IN, false)
}
- 从 SharedPreferences 读取布尔值
- 第二个参数
false是默认值,如果 SharedPreferences 中没有存储这个键,就返回false
4.3 获取当前用户名
kotlin
fun getUsername(): String? {
return sharedPreferences.getString(KEY_USERNAME, null)
}
- 返回当前登录用户名,若没有登录或未存储用户名则返回
null
4.4 设置隐私协议同意状态
kotlin
fun setPrivacyAgreed(agreed: Boolean) {
sharedPreferences.edit().putBoolean(KEY_HAS_AGREED_PRIVACY, agreed).apply()
}
- 直接在一行内写入布尔值并提交
- 表示用户是否同意隐私协议
4.5 获取隐私协议状态
kotlin
fun isPrivacyAgreed(): Boolean {
return sharedPreferences.getBoolean(KEY_HAS_AGREED_PRIVACY, false)
}
- 如果 SharedPreferences 中没有保存该键,默认返回
false
4.6 退出登录
kotlin
fun logout() {
sharedPreferences.edit().apply {
remove(KEY_IS_LOGGED_IN)
remove(KEY_USERNAME)
apply()
}
}
- 删除登录相关信息
remove("key")→ 删除对应的键值对apply()→ 异步提交修改- 这样用户下次打开应用就会被认为未登录
5️⃣ Kotlin 语法亮点总结
-
作用域函数
apply- 在对象的上下文中执行代码
- 返回对象本身
- 用于链式调用 Editor 方法,提高可读性
-
可空类型与默认参数
kotlinfun setLoggedIn(isLoggedIn: Boolean, username: String? = null)String?→ 可以为 null= null→ 调用时可不传该参数
-
companion object + const
- 定义类级别的常量
- 用于 SharedPreferences 的键和值的统一管理
-
SharedPreferences 的提交方式
apply()→ 异步,性能好commit()→ 同步,立即写入磁盘,性能稍差