AnyPreference:Android存储变量像赋值一样简单
还在为 Android 中的 SharedPreferences 繁琐的 API 而烦恼吗?每次存储一个简单值都要写一堆模板代码,想要存储自定义对象更是麻烦。这里介绍一个轻量级的键值存储库 AnyPreferences,让存储变量像赋值一样简单!
项目地址:wraphex/any-preference 🌟 欢迎 Star 和 Issue!
特性
- 类型安全:通过 Kotlin reified 泛型与
KType在编译时捕获类型信息 - 属性委托:使用
by关键字实现简洁的读写 API - 复杂类型支持:非基本类型通过 Gson 自动 JSON 序列化
- 多后端:可选 SharedPreferences 或 MMKV 实现
集成
在项目根目录的
settings.gradle.kts中添加 JitPack 仓库:ktsdependencyResolutionManagement { repositories { //... maven { url = uri("https://jitpack.io") } } }在模块的
build.gradle.kts中添加依赖(选择其中一个):ktsdependencies { // SharedPreferences implementation("com.github.wraphex.any-preference:any-preference-sp:main-SNAPSHOT") // or MMKV implementation("com.github.wraphex.any-preference:any-preference-mmkv:main-SNAPSHOT") }
快速开始
在
Application.onCreate()中初始化:kotlinclass MyApplication : Application() { override fun onCreate() { super.onCreate() AnyPreference.initialize(this) } }使用
preference声明属性:kotlinval user1 = User(1, "Alice") val user2 = User(2, "Bob") // 基本类型 var age by preference(defaultValue = 0) // 自定义对象 var userPref by preference(defaultValue = user1) // 带类型空值 var userNullable by preference(defaultValue = null as User?) // 自定义键名 var darkMode by preference(key = "dark_mode", defaultValue = false) fun usage() { val user = User(3, "Carol") // set: 像给变量赋值一样保存 userPref = user // get: 像获取变量值一样读取 Log.d(TAG, "preference: $user $userPref") assertEquals(user, userPref) // remove: 赋值为null删除键值 userPref = null }
架构
核心层(
main源码集)AnyPreferenceDelegate<T>:抽象基类,实现getValue/setValue读写逻辑,处理基本类型存储与 Gson JSON 序列化BaseAnyPreferences:基类,管理 Context 生命周期与初始化AnyPreferenceFactory:提供内联函数preference创建委托实例
SharedPreferences 实现(
sp源码集)AnyPreferenceDelegateImpl<T>:继承自AnyPreferenceDelegate,使用SharedPreferences作为存储后端AnyPreferences:继承自BaseAnyPreferences,单例对象,管理全局 Context
MMKV 实现(
mmkv源码集)AnyPreferenceDelegateImpl<T>:继承自AnyPreferenceDelegate,使用MMKV作为存储后端AnyPreferences:继承自BaseAnyPreferences,初始化 MMKV 并管理全局 Context
数据流:
用户属性声明 → preference() → AnyPreferenceDelegateImpl → AnyPreferenceDelegate.getValue/setValue → SharedPreferences/MMKV
注意
- 键名规则:默认使用属性名作为键名,可通过
key参数自定义 - 存储文件名:
- SharedPreferences:默认文件名为
{packageName}_preferences,可通过name参数指定 - MMKV:默认使用
defaultMMKV(),可通过name参数指定不同的 MMKV ID
- SharedPreferences:默认文件名为