← Назад к вопросам

Что такое SharedPreferences?

2.0 Middle🔥 171 комментариев
#JavaScript Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое SharedPreferences?

SharedPreferences — это механизм в экосистеме Android для хранения небольших объемов данных в формате ключ-значение (key-value) в виде XML-файлов. Это простой и удобный способ сохранения примитивных типов данных (строк, чисел, булевых значений) между сессиями работы приложения, позволяющий обеспечить сохранность пользовательских настроек, состояния интерфейса или других легковесных данных.

Ключевые особенности и принцип работы

SharedPreferences предоставляет легковесное постоянное хранилище (persistent storage), которое:

  • Работает по принципу пар ключ-значение.
  • Автоматически сериализует данные в XML-формат и сохраняет их в приватной директории приложения (/data/data/<package_name>/shared_prefs/).
  • Не подходит для хранения больших или сложных структур данных (для этого используются базы данных SQLite или Room, или файловое хранилище).
  • Обеспечивает потокобезопасность для операций чтения и, при использовании правильного подхода, для операций записи.

Основные методы и использование

Для работы с SharedPreferences необходимо получить его экземпляр. Основные методы находятся в классе SharedPreferences и его внутреннем интерфейсе Editor.

1. Получение экземпляра SharedPreferences

// Kotlin (в Activity, Fragment или Context)
// Режим MODE_PRIVATE устарел, сейчас это единственный и default режим
val sharedPref = getSharedPreferences("my_app_prefs", Context.MODE_PRIVATE)

// Или, если нужны "дефолтные" настройки для активности
val defaultSharedPref = PreferenceManager.getDefaultSharedPreferences(context)
// Java
SharedPreferences sharedPref = getSharedPreferences("my_app_prefs", Context.MODE_PRIVATE);

2. Запись данных

Для записи необходимо использовать объект Editor. Все изменения применяются атомарно при вызове apply() или commit().

val editor = sharedPref.edit()
editor.putString("user_name", "John Doe")
editor.putInt("user_score", 100)
editor.putBoolean("notifications_enabled", true)
editor.putFloat("volume_level", 0.75f)

// Асинхронное сохранение (предпочтительный способ)
editor.apply()

// Синхронное сохранение с возвратом результата (используется реже)
val isSuccess = editor.commit()
  • apply(): Сохраняет изменения асинхронно в фоновом потоке. Не блокирует UI, не возвращает результат успешности. Рекомендуется к использованию.
  • commit(): Сохраняет изменения синхронно (немедленно), блокируя вызывающий поток до завершения записи. Возвращает boolean, указывающий на успех операции. Может вызывать лаги в UI, если используется в основном потоке.

3. Чтение данных

Чтение данных выполняется напрямую через методы экземпляра SharedPreferences. Можно предоставлять значение по умолчанию, которое вернется, если ключ не найден.

val userName = sharedPref.getString("user_name", "Guest") // "Guest" - default value
val userScore = sharedPref.getInt("user_score", 0)
val isNotificationOn = sharedPref.getBoolean("notifications_enabled", false)
val volume = sharedPref.getFloat("volume_level", 0.5f)

Сценарии использования SharedPreferences

  1. Сохранение пользовательских настроек: тема приложения (светлая/темная), язык, единицы измерения, настройки уведомлений.
  2. Хранение состояния сессии: токен авторизации, логин пользователя, время последнего входа (хотя для критичных данных лучше использовать более защищенные методы, например, EncryptedSharedPreferences).
  3. Кеширование легковесных данных: дата последнего обновления данных, флаг первого запуска приложения (isFirstLaunch).
  4. Сохранение простых игровых прогрессов: очки, текущий уровень, unlocked achievements.

Важные ограничения и современные альтернативы

  • Безопасность: Обычный SharedPreferences не шифрует данные. Конфиденциальная информация (пароли, токены) не должна в нем храниться. Для этой цели с Android SDK 23+ существует EncryptedSharedPreferences из библиотеки Security Crypto, который прозрачно шифрует ключи и значения.
  • Производительность: Частые операции записи apply() могут создавать нагрузку. Не предназначен для частых или объемных записей.
  • Типы данных: Поддерживаются только примитивные типы и их множества (Set<String>). Для хранения сложных объектов требуется их сериализация (например, в JSON).
  • Jetpack DataStore: Современная рекомендуемая Google альтернатива. Библиотека Preferences DataStore предоставляет асинхронный, типобезопасный API на основе Kotlin Coroutines/Flow для хранения пар ключ-значение. Proto DataStore позволяет хранить типизированные объекты с помощью Protocol Buffers. DataStore решает проблемы apply() блокировок UI и предоставляет более надежный и выразительный API.

Вывод

SharedPreferences — это фундаментальный и простой инструмент для постоянного хранения легковесных данных в Android-приложениях. Он отлично подходит для некритичных настроек и состояния UI благодаря своему простому API. Однако для современных приложений, особенно при работе с конфиденциальными данными или при желании использовать реактивные паттерны, следует рассматривать EncryptedSharedPreferences или Jetpack DataStore как более прогрессивные и безопасные альтернативы. Понимание его работы остается важным для поддержки legacy-кода и для задач, где его простота является преимуществом.