1.定义 PrefsManager
创建一个用于管理 SharedPreferences
的单例工具类,并使用泛型方法来简化对不同类型数据的存取操作,该类提供了泛型的 get
和 set
方法来处理各种数据类型。
import android.content.Context
import android.content.SharedPreferences
import android.util.Log
object PrefsManager {
private lateinit var sharedPreferences: SharedPreferences
fun init(context: Context) {
sharedPreferences = context.getSharedPreferences("AppPreferences", Context.MODE_PRIVATE)
}
fun <T> get(prefKey: PrefKey): T {
val defaultValue: T = PrefDefaults.getDefaultValue(prefKey)
return when (defaultValue) {
is Boolean -> sharedPreferences.getBoolean(prefKey.key, defaultValue) as? T ?: defaultValue
is Int -> sharedPreferences.getInt(prefKey.key, defaultValue) as? T ?: defaultValue
is String -> sharedPreferences.getString(prefKey.key, defaultValue) as? T ?: defaultValue
else -> {
Log.w("SharedPreferences", "Unsupported type for SharedPreferences.get")
defaultValue
}
}
}
fun <T> set(prefKey: PrefKey, value: T) {
with(sharedPreferences.edit()) {
when (value) {
is Boolean -> putBoolean(prefKey.key, value)
is Int -> putInt(prefKey.key, value)
is String -> putString(prefKey.key, value)
else -> Log.w("SharedPreferences", "Unsupported type for SharedPreferences.set")
}
apply()
}
}
}
/// 让 PrefKey 枚举仅包含用户定义的键(key)
enum class PrefKey(val key: String) {
IS_LOGGED_IN("isLoggedIn"),
USER_AGE("userAge"),
USER_NAME("userName");
}
/// 管理默认值和类型
object PrefDefaults {
private val defaultValues = mapOf<PrefKey, Any>(
PrefKey.IS_LOGGED_IN to false,
PrefKey.USER_AGE to 18,
PrefKey.USER_NAME to "John Doe"
)
@Suppress("UNCHECKED_CAST")
fun <T> getDefaultValue(prefKey: PrefKey): T = defaultValues[prefKey] as T
}
2.使用 PrefsManager
初始化
首先需要在合适的地方(如在 Application
类或主 Activity
的 onCreate
方法中)初始化 PrefsManager
.
class MyApp : Application() {
override fun onCreate() {
super.onCreate()
PrefsManager.init(this)
}
}
存取数据
使用 PrefsManager
时,您不需要关心类型和默认值,这些都是在内部处理的.
// 存储数据
PrefsManager.set(PrefKey.IS_LOGGED_IN, true)
PrefsManager.set(PrefKey.USER_AGE, 30)
PrefsManager.set(PrefKey.USER_NAME, "Alice")
// 读取数据
val isLoggedIn: Boolean = PrefsManager.get(PrefKey.IS_LOGGED_IN)
val userAge: Int = PrefsManager.get(PrefKey.USER_AGE)
val userName: String = PrefsManager.get(PrefKey.USER_NAME)