Что такое SharedPreferences?

SharedPreferences — это механизм в Android для простого и лёгкого хранения пар "ключ-значение" в перманентной памяти устройства. Он используется для хранения небольших объёмов данных, которые должны сохраняться между запусками приложения. Данные хранятся в виде XML-файла внутри приватной директории приложения.

🔹 Где применяется SharedPreferences

  • Сохранение пользовательских настроек и флагов (темная тема, авторизация, первый запуск).

  • Сохранение токенов доступа, ID и состояний.

  • Хранение конфигурации без необходимости базы данных.

📁 Где физически хранятся данные

XML-файлы SharedPreferences находятся по пути:

/data/data/<package_name>/shared_prefs/<file_name>.xml

Это внутренняя память, недоступная другим приложениям (если не root).

🔧 Пример использования

Сохранение данных:

val prefs = getSharedPreferences("my_prefs", Context.MODE_PRIVATE)
prefs.edit().putBoolean("dark_mode", true).apply()
  • "my_prefs" — имя файла настроек.

  • putBoolean(...) — записывает значение.

  • apply() — сохраняет данные асинхронно (без блокировки потока).

Получение данных:

val prefs = getSharedPreferences("my_prefs", Context.MODE_PRIVATE)
val isDarkMode = prefs.getBoolean("dark_mode", false)
  • Второй аргумент — значение по умолчанию, если ключ не найден.

🧠 Способы сохранения

  • apply() — сохраняет асинхронно, быстрее, не возвращает результат.

  • commit() — сохраняет синхронно, возвращает true/false, но может блокировать поток.

Предпочтительнее использовать apply() для UI-приложений.

Ключевые особенности

Характеристика Описание
Формат хранения XML
--- ---
Типы данных String, Int, Boolean, Float, Long, Set<String>
--- ---
Поддержка многопоточности Есть, но возможны конфликты при одновременной записи
--- ---
Максимальный объём данных Рекомендуется не превышать 1–2 МБ
--- ---
Доступ Только внутри приложения
--- ---
Удаление данных Через remove(key) или clear()
--- ---

Ограничения

  • **Не подходит для хранения больших объёмов данных.
    **
  • Нет строгой типизации — можно случайно читать Int как String, и получить ClassCastException.

  • Нет миграции или схемы — управление версиями данных вручную.

  • Устаревает — в новых проектах часто заменяют на DataStore.

🔐 Безопасность

  • Данные в SharedPreferences хранятся незашифрованными по умолчанию.

  • Для конфиденциальных данных рекомендуется использовать:
    EncryptedSharedPreferences из Android Jetpack Security.

✅ Когда использовать SharedPreferences

Используйте, если нужно:

  • хранить флаги, настройки, логины, токены;

  • работать с простыми, небольшими значениями;

  • сохранять данные, которые не требуют структурности и связей.

Если нужно работать с более сложными данными — используйте Room или DataStore.

🧠 Итого

SharedPreferences — это простой и быстрый способ хранения ключ-значение данных внутри Android-приложения. Он удобен для настроек и флагов, легко использовать, не требует базы данных, но не подходит для хранения больших или сложных структурированных данных.