Home » Android Shared Preferences — учебное пособие с примером
Android Shared Preferences — учебное пособие с примером

Android Shared Preferences — учебное пособие с примером

Если ты когда-нибудь ковырялся в Android-приложениях, то наверняка сталкивался с задачей: “Как бы сохранить пару настроек, чтобы они не слетали после перезапуска?” Или, например, нужно быстро сохранить токен авторизации, флаг “прошёл ли пользователь туториал”, или просто пару кастомных параметров. Вот тут на сцену выходит Android Shared Preferences — встроенный механизм для хранения простых данных в формате ключ-значение. В этой статье разберёмся, что это такое, как оно работает, как быстро всё настроить, и, конечно, приведём рабочие примеры, схемы, лайфхаки и даже пару подводных камней. Всё — на практике, без воды и маркетинговых соплей.

Что такое Android Shared Preferences и зачем оно нужно?

Shared Preferences — это, по сути, легковесное хранилище для хранения пар “ключ-значение” в приватном XML-файле внутри приложения. Это не база данных, не файловая система, а именно быстрый способ сохранить небольшие данные, которые нужны между сессиями. Например:

  • Настройки пользователя (тема, язык, уведомления)
  • Флаги (прошёл ли пользователь onboarding, включил ли какую-то функцию)
  • Токены, идентификаторы, временные значения

Всё это хранится локально, не требует никаких зависимостей, работает быстро и просто. Но есть нюансы, о которых ниже.

Как это работает?

Внутри Android Shared Preferences — это просто XML-файл, который лежит в приватной папке приложения. Доступ к нему есть только у самого приложения (если не рутовать устройство и не лезть в /data/data/…). Работа с Shared Preferences идёт через специальный API, который позволяет читать, писать и удалять значения по ключу.

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

  • Данные хранятся в виде пар “ключ-значение” (String, int, boolean, float, long, Set<String>)
  • Нет поддержки сложных структур (массивы, объекты — только сериализовать вручную)
  • Данные живут, пока не удалишь приложение или не очистишь данные
  • Работает быстро, но не для больших объёмов (до 1-2 МБ — ок, больше — уже не стоит)

Как быстро и просто всё настроить?

Всё, что нужно — это получить экземпляр SharedPreferences, а дальше — дело техники. Вот базовый пример:

val prefs = context.getSharedPreferences("my_prefs", Context.MODE_PRIVATE)

// Сохранить значение
prefs.edit().putString("username", "root").apply()

// Прочитать значение
val username = prefs.getString("username", "default_user")

// Удалить значение
prefs.edit().remove("username").apply()

// Очистить всё
prefs.edit().clear().apply()

Всё просто: получаешь prefs, вызываешь edit(), меняешь что надо, и применяешь изменения через apply() (асинхронно) или commit() (синхронно, но медленнее).

Примеры, схемы, практические советы

Давай разберём несколько кейсов — как делать правильно, а как не стоит.

Кейс Плюсы Минусы Рекомендации
Хранить токен авторизации Быстро, просто, не требует базы Не шифруется, можно вытащить с root-доступом Для критичных данных — использовать EncryptedSharedPreferences (см. ниже)
Хранить настройки пользователя (тема, язык) Идеально подходит, легко менять Нет Использовать SharedPreferences, не усложнять
Хранить большие массивы данных (историю, логи) Просто реализовать Медленно, XML-файл разрастается, возможны сбои Использовать SQLite или Room для больших объёмов
Хранить сложные объекты (JSON, списки) Возможно через сериализацию Неудобно, нет типизации, сложно поддерживать Сохранять только простые типы, для сложных — использовать базы

Положительный пример

// Сохраняем флаг, что пользователь прошёл туториал
prefs.edit().putBoolean("onboarding_complete", true).apply()

// Проверяем при запуске
if (!prefs.getBoolean("onboarding_complete", false)) {
    // Показываем туториал
}

Отрицательный пример

// Пытаемся сохранить огромный JSON
prefs.edit().putString("all_logs", bigJsonString).apply()
// Итог: тормоза, возможна потеря данных, SharedPreferences не для этого

Команды и сниппеты для быстрой работы

Вот полный список команд для работы с SharedPreferences:

// Получить экземпляр SharedPreferences
val prefs = context.getSharedPreferences("имя_файла", Context.MODE_PRIVATE)

// Сохранить значения
prefs.edit().putString("key", "value").apply()
prefs.edit().putInt("key", 42).apply()
prefs.edit().putBoolean("key", true).apply()
prefs.edit().putFloat("key", 3.14f).apply()
prefs.edit().putLong("key", 123456789L).apply()
prefs.edit().putStringSet("key", setOf("a", "b", "c")).apply()

// Прочитать значения
prefs.getString("key", "default")
prefs.getInt("key", 0)
prefs.getBoolean("key", false)
prefs.getFloat("key", 0.0f)
prefs.getLong("key", 0L)
prefs.getStringSet("key", emptySet())

// Удалить значение
prefs.edit().remove("key").apply()

// Очистить всё
prefs.edit().clear().apply()

Похожие решения, программы и утилиты

  • EncryptedSharedPreferences — официальное расширение для безопасного хранения данных (шифрует значения на лету). Документация
  • DataStore — современная альтернатива SharedPreferences от Google, работает на Kotlin Coroutines, поддерживает Flow, более надёжный и быстрый. Документация
  • MMKV — быстрый key-value storage от WeChat, кроссплатформенный, поддерживает большие объёмы данных. GitHub
  • SQLite/Room — если нужно хранить сложные структуры и большие объёмы, лучше использовать полноценную базу данных.

Статистика и сравнение с другими решениями

Решение Скорость Безопасность Объём данных Поддержка сложных структур Асинхронность
SharedPreferences Быстро (до 1МБ) Средняя (нет шифрования) Малый Нет apply() — да, commit() — нет
EncryptedSharedPreferences Чуть медленнее Высокая (шифрование) Малый Нет Да
DataStore Очень быстро Средняя/высокая Средний Да (протоколы, сериализация) Да (Kotlin coroutines)
MMKV Очень быстро Средняя/высокая Большой Да Да
SQLite/Room Быстро (но сложнее API) Высокая (можно шифровать) Очень большой Да Да

Интересные факты и нестандартные способы использования

  • SharedPreferences можно использовать для A/B тестирования — сохраняешь флаг, в какую группу попал пользователь, и меняешь поведение приложения на лету.
  • Можно хранить временные кэши — например, последний запрос к серверу, чтобы не дёргать API лишний раз.
  • Скрипты для автоматизации тестов — через adb можно читать и писать SharedPreferences, что удобно для автотестов и CI/CD.
  • Миграция настроек между версиями — SharedPreferences легко мигрировать, просто читаешь старые ключи и пишешь новые.
  • Можно использовать для хранения “пасхалок” — например, если пользователь 10 раз нажал на логотип, сохраняешь это в prefs и открываешь секретный режим.

Автоматизация и скрипты: новые возможности

SharedPreferences отлично вписывается в автоматизацию тестирования и CI/CD. Например, можно через adb shell читать и писать значения прямо из скриптов:

// Прочитать файл SharedPreferences с устройства
adb shell cat /data/data/<package_name>/shared_prefs/<prefs_file>.xml

// Залить новый файл настроек
adb push my_prefs.xml /data/data/<package_name>/shared_prefs/

Это удобно для массового тестирования, настройки демо-режимов, сброса состояния приложения и даже для быстрой отладки на реальных устройствах.

Выводы и рекомендации

Android Shared Preferences — это must-have инструмент для любого, кто пишет или настраивает Android-приложения. Он прост, быстр, не требует лишних зависимостей и идеально подходит для хранения небольших настроек, флагов, токенов и прочих “мелочей”. Но помни: не стоит хранить в SharedPreferences большие объёмы данных или сложные структуры — для этого есть базы данных и современные key-value storage (DataStore, MMKV).

Если нужна безопасность — используй EncryptedSharedPreferences. Если хочется асинхронности и поддержки Flow — смотри в сторону DataStore. Для кроссплатформенных задач и больших объёмов — MMKV.

SharedPreferences отлично подходит для автоматизации, скриптов и быстрой настройки приложений на лету. Не забывай про adb, CI/CD и возможности миграции настроек между версиями.

В общем, если тебе нужен быстрый и надёжный способ хранить настройки или флаги в Android — SharedPreferences твой друг. А если нужен сервер для тестирования или автоматизации — смело заказывай VPS или выделенный сервер — и вперёд, к автоматизации и DevOps-магии!

Официальная документация: https://developer.android.com/reference/android/content/SharedPreferences


В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.

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

Leave a reply

Your email address will not be published. Required fields are marked