SharedPreferences — это механизм в Android для хранения простых данных в формате ключ-значение. Это легковесное решение для сохранения примитивных типов данных (boolean, float, int, long, string) и их наборов.
Типы хранимых данных:
Int
, Float
, Boolean
, Long
, String
Set<String>
Формат хранения:
/data/data/ваш.package/shared_prefs/
)<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<boolean name="is_dark_mode" value="true" />
<string name="username">JohnDoe</string>
</map>
Режимы работы (до API 23):
MODE_PRIVATE
— доступ только для вашего приложенияMODE_WORLD_READABLE
, MODE_WORLD_WRITEABLE
// Предпочтительный способ (с Context)
val prefs = context.getSharedPreferences("my_prefs", Context.MODE_PRIVATE)
// Для Activity (упрощенный вариант)
val activityPrefs = getPreferences(Context.MODE_PRIVATE)
Используйте Editor
для модификации:
prefs.edit().apply {
putBoolean("is_first_launch", false)
putString("user_email", "user@example.com")
apply() // или commit()
}
Разница между apply()
и commit()
:
apply()
— асинхронная запись (без возврата результата)commit()
— синхронная запись (возвращает boolean)val isDarkMode = prefs.getBoolean("is_dark_mode", false) // false - значение по умолчанию
val username = prefs.getString("username", null)
Инкапсуляция доступа: Создайте отдельный класс-менеджер:
class PrefsManager(context: Context) {
private val prefs = context.getSharedPreferences("app_prefs", Context.MODE_PRIVATE)
var isFirstLaunch: Boolean
get() = prefs.getBoolean("is_first_launch", true)
set(value) = prefs.edit().putBoolean("is_first_launch", value).apply()
}
Безопасность:
EncryptedSharedPreferences
:val masterKey = MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build()
val securePrefs = EncryptedSharedPreferences.create(
context,
"secure_prefs",
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)
Миграция на DataStore: Для сложных случаев рекомендуется использовать Jetpack DataStore:
// В build.gradle:
implementation "androidx.datastore:datastore-preferences:1.0.0"
// Создание:
val Context.dataStore by preferencesDataStore(name = "settings")
Не подходит для:
Проблемы производительности:
commit()
apply()
вместо commit()
EncryptedSharedPreferences
для безопасностиDataStore
для современного подходаПример использования с LiveData:
fun getLivePreference(key: String, defValue: T): LiveData<T> {
return prefs.liveData(key, defValue) // Используя androidx.lifecycle:lifecycle-livedata-ktx
}