SharedPreferences: що це, ключ-значення сховище Android

Автор: IT Sectr Опубліковано: 2026-03-12 Час читання: 9 хв

SharedPreferences — це ключ-значення сховище даних на Android, призначене для збереження простих налаштувань та конфігурацій додатку. Дані зберігаються в XML-файлі на пристрої та доступні лише всередині додатку, який їх створив. Згідно з офіційною документацією Android Developers, 2025, SharedPreferences підтримує зберігання примітивних типів: String, Int, Boolean, Float, Long та Set<String>. Це найпростіше та найшвидше рішення для збереження невеликих обсягів користувацьких налаштувань без необхідності в SQL-запитах або роботі з файловою системою безпосередньо.

Головне

  • SharedPreferences — ключ-значення сховище Android для збереження простих налаштувань додатку в XML-файлі.
  • Підтримує п'ять типів даних: String, Int, Boolean, Float, Long та Set<String>.
  • Працює синхронно (get) та асинхронно (apply) для операцій запису зі збереженням на диск.
  • Дані ізольовані за ім'ям файлу та режимом доступу (PRIVATE, MULTI_PROCESS).
  • Для великих обсягів даних Google рекомендує використовувати DataStore або Room замість SharedPreferences.

Що таке SharedPreferences?

SharedPreferences — це вбудований механізм Android для зберігання пар ключ-значення в XML-файлі на внутрішньому сховищі пристрою. Він доступний починаючи з API Level 1 і не потребує підключення додаткових бібліотек. Основне призначення — збереження користувацьких налаштувань, стану інтерфейсу, прапорців першого запуску та інших простих даних, які не потребують структурованої бази даних.

Кожен файл SharedPreferences пов'язаний з конкретним ім'ям та режимом доступу. За замовчуванням використовується режим Context.MODE_PRIVATE, який обмежує доступ до файлу лише поточним додатком. Раніше Android підтримував режими MODE_WORLD_READABLE та MODE_WORLD_WRITEABLE, але вони були оголошені застарілими починаючи з API Level 17 та повністю видалені в Android 7.0 (API 24) з міркувань безпеки.

Незважаючи на свою простоту, SharedPreferences використовується в мільйонах Android-додатків. За даними Google, понад 90% додатків, опублікованих в Google Play, використовують SharedPreferences для зберігання налаштувань. Однак для складних сценаріїв (великі обсяги даних, типобезпека, асинхронність) Google рекомендує більш сучасні рішення, такі як Preferences DataStore з бібліотеки Android Jetpack.

Формат зберігання: XML на пристрої

Фізично SharedPreferences зберігається у вигляді XML-файлу в директорії додатку: /data/data/{package_name}/shared_prefs/{file_name}.xml. Файл містить кореневий елемент <map> з дочірніми елементами <string>, <int>, <boolean>, <float> та <long> залежно від типу збереженого значення. Розмір файлу не обмежений, але для великих обсягів даних (понад 100 KB) продуктивність читання та запису починає помітно знижуватися.

Файли SharedPreferences не шифруються за замовчуванням. Дані зберігаються у відкритому вигляді в файловій системі пристрою. Для зберігання чутливих даних (токени, паролі) рекомендується використовувати EncryptedSharedPreferences з бібліотеки AndroidX Security, яка автоматично шифрує ключі та значення за допомогою AES256-GCM.

Як працює SharedPreferences в Android

SharedPreferences працює за принципом кешування в пам'яті з періодичною синхронізацією на диск. При першому зверненні до файлу (через getSharedPreferences) Android завантажує XML-файл в оперативну пам'ять та парсить його в об'єкт Map. Всі наступні операції читання виконуються з пам'яті, без повторного читання з диска. Це забезпечує високу швидкість доступу до даних.

Операції запису використовують Editor — внутрішній буфер змін. Коли розробник викликає putString або putBoolean, зміни зберігаються в об'єкті Editor в пам'яті. Фактичний запис на диск відбувається при виклику методу commit (синхронно) або apply (асинхронно). До виклику цих методів дані не зберігаються, і при аварійному завершенні додатку зміни можуть бути втрачені.

Режими доступу та контекст

Для отримання екземпляра SharedPreferences використовуються два методи: getPreferences та getSharedPreferences. Перший доступний лише всередині Activity та створює файл з ім'ям Activity. Другий — більш гнучкий, приймає ім'я файлу та режим доступу, і доступний з будь-якого контексту (Application, Activity, Service). Рекомендується використовувати getSharedPreferences з ім'ям файлу, що відповідає модулю або функціональності додатку.

kotlin
// Отримання SharedPreferences
val prefs = context.getSharedPreferences(
    "user_settings", Context.MODE_PRIVATE
)

// Запис даних
with(prefs.edit()) {
    putString("username", "Ганна")
    putInt("age", 28)
    putBoolean("isLoggedIn", true)
    apply()
}

// Читання даних
val username = prefs.getString("username", "")
val age = prefs.getInt("age", 0)
val isLoggedIn = prefs.getBoolean("isLoggedIn", false)

При використанні MODE_MULTI_PROCESS (застарілий) SharedPreferences синхронізується між процесами. Однак ця синхронізація не гарантує атомарність, і Google рекомендує уникати використання SharedPreferences в мультипроцесних сценаріях. Для таких випадків краще використовувати ContentProvider, Room з міжпроцесним доступом або DataStore.

Основні методи SharedPreferences

SharedPreferences надає набір методів для читання даних за ключем та інтерфейс Editor для запису. Кожен метод читання приймає два параметри: ключ та значення за замовчуванням, яке повертається, якщо ключ не знайдено. Значення за замовчуванням визначає також тип значення, що повертається: getString повертає String, getInt — Int і так далі.

Метод читанняМетод записуТип даних
getStringputStringString
getIntputIntInt
getBooleanputBooleanBoolean
getFloatputFloatFloat
getLongputLongLong
getStringSetputStringSetSet<String>

Editor та apply vs commit

Editor — це внутрішній об'єкт SharedPreferences, який збирає зміни в буфері. Після внесення всіх змін розробник викликає commit() (синхронний запис) або apply() (асинхронний запис). Різниця критична: commit блокує поточний потік до повного запису на диск та повертає boolean (успіх/невдача), а apply виконує запис у фоновому потоці та негайно повертає управління, але не повертає результат.

Рекомендується використовувати apply замість commit у всіх випадках, коли не потрібно знати результат запису. apply швидший та не блокує UI-потік. commit слід використовувати лише коли критично знати, чи успішно збереглися дані, або при роботі з мультипроцесним режимом. Для видалення окремих ключів використовується метод remove, для повного очищення — clear. Всі операції видалення також виконуються через Editor.

kotlin
// Множинні зміни - один apply
prefs.edit {
    putString("theme", "dark")
    putBoolean("notifications", false)
    remove("old_key")
}

// Слухач зміни значень
prefs.registerOnSharedPreferenceChangeListener { prefs, key ->
    Log.d("TAG", "Змінився ключ: $key")
}

Починаючи з Android 12 (API 31), SharedPreferences була доповнена підтримкою registerOnSharedPreferenceChangeListener з автоматичним відписуванням через Lifecycle. Це дозволяє уникнути витоків пам'яті, пов'язаних із забутими слухачами. У старіших версіях розробник зобов'язаний вручну викликати unregisterOnSharedPreferenceChangeListener в onDestroy або onStop компонента.

SharedPreferences vs альтернативи зберігання

Незважаючи на широку поширеність, SharedPreferences не є універсальним рішенням для всіх сценаріїв зберігання даних на Android. Залежно від обсягу даних, вимог до типобезпеки та продуктивності, Google рекомендує різні альтернативи, включені в Android Jetpack та стандартну бібліотеку Android.

РішенняКоли використовуватиНедоліки
SharedPreferencesНевеликі налаштування (до 100 ключів)Немає типобезпеки, синхронне читання
DataStoreНалаштування середньої складності з корутинамиНемає зворотної сумісності нижче API 14
RoomСтруктуровані дані та спискиНадлишковий для 3-5 налаштувань
EncryptedSharedPreferencesЧутливі дані та токениЗалежність від AndroidX Security

DataStore — сучасна альтернатива

DataStore — це бібліотека Android Jetpack, представлена Google як заміна SharedPreferences. Вона надає два варіанти: Preferences DataStore (ключ-значення, як SharedPreferences) та Proto DataStore (типізоване зберігання через Protocol Buffers). DataStore використовує корутини та Flow для асинхронної роботи, гарантує типобезпеку та автоматично обробляє міграції версій. Google рекомендує DataStore для всіх нових проектів.

Основна перевага DataStore — асинхронність на рівні API. Всі операції читання повертають Flow, а операції запису є suspend-функціями. Це повністю виключає блокування UI-потоку, яке можливе при синхронному читанні SharedPreferences. Крім того, DataStore гарантує консистентність даних: запис виконується в транзакції, і при збої всі зміни відкочуються.

Приклад використання SharedPreferences в додатку

Розглянемо практичний приклад: налаштування теми оформлення (світла/темна/системна) в Android-додатку. Користувач вибирає тему, і вибір зберігається в SharedPreferences. При наступних запусках додатку тема відновлюється зі збережених налаштувань. Для реактивного оновлення UI використовується спостереження за змінами через SharedPreferences.OnSharedPreferenceChangeListener.

Збереження налаштувань користувача

Створимо клас ThemePreferences, який інкапсулює всю роботу з SharedPreferences для теми. Клас надає методи getTheme (читання), setTheme (запис) та observeTheme (спостереження). Ім'я файлу налаштувань буде «app_preferences» з режимом MODE_PRIVATE. Для зручності ключі винесені в companion object як константи.

kotlin
class ThemePreferences(context: Context) {
    companion object {
        private const val PREF_NAME = "app_preferences"
        private const val KEY_THEME = "theme_mode"
        const val THEME_LIGHT = "light"
        const val THEME_DARK = "dark"
        const val THEME_SYSTEM = "system"
    }

    private val prefs = context
        .getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)

    fun getTheme(): String =
        prefs.getString(KEY_THEME, THEME_SYSTEM) ?: THEME_SYSTEM

    fun setTheme(theme: String) {
        prefs.edit { putString(KEY_THEME, theme) }
    }

    fun observeTheme(callback: (String) -> Unit) {
        prefs.registerOnSharedPreferenceChangeListener { _, key ->
            if (key == KEY_THEME) {
                callback.invoke(getTheme())
            }
        }
    }
}

В Activity або Fragment отримання екземпляра ThemePreferences виконується через контекст додатку. При ініціалізації викликається getTheme для встановлення актуальної теми. При виборі користувачем нової теми викликається setTheme, і через observeTheme інтерфейс оновлюється без перезапуску Activity. Важливо не забути відписатися від listener в onDestroy для запобігання витоку пам'яті, особливо якщо Activity перестворюється при зміні конфігурації.

Для додатків з мінімальною цільовою версією Android 12+ рекомендується використовувати registerOnSharedPreferenceChangeListener спільно з LifecycleObserver. Це автоматично керує підпискою та відпискою при зміні життєвого циклу компонента. Для старіших версій підписку та відписку необхідно керувати вручну, що є частим джерелом помилок у production-додатках, які використовують SharedPreferences.

Поширені запитання

Чи можна зберігати об'єкти в SharedPreferences?

SharedPreferences безпосередньо підтримує лише примітивні типи та Set<String>. Для зберігання об'єктів необхідно серіалізувати їх в JSON-рядок через Gson або Moshi, зберегти через putString, та десеріалізувати при читанні. Для складних об'єктів з великою кількістю полів рекомендується використовувати Room замість SharedPreferences з JSON-серіалізацією.

Чи є SharedPreferences thread-safe?

Так, SharedPreferences thread-safe. Всі операції читання та запису синхронізовані на рівні об'єкта SharedPreferences та його Editor. Однак при використанні мультипроцесного режиму синхронізація не гарантується. Для конкурентного доступу з кількох потоків всередині одного додатку SharedPreferences безпечний без додаткових блокувань.

Як очистити всі дані SharedPreferences?

Для повного очищення всіх даних з SharedPreferences викличте метод clear() на Editor та застосуйте зміни через apply. Якщо потрібно видалити сам XML-файл, використовуйте deleteSharedPreferences(name) на контексті. Очищення даних додатку через Налаштування → Додатки → Очистити дані також видаляє всі файли SharedPreferences.

SharedPreferences чи DataStore: що вибрати?

Для нових проектів Google рекомендує DataStore як заміну SharedPreferences. DataStore забезпечує асинхронну роботу з корутинами, типобезпеку (Proto DataStore) та автоматичні міграції. SharedPreferences варто вибирати лише для проектів з мінімальною версією нижче API 14 або при необхідності швидкої інтеграції без додаткових залежностей.

Як шифрувати дані в SharedPreferences?

Для шифрування даних використовуйте EncryptedSharedPreferences з бібліотеки AndroidX Security. Вона автоматично шифрує ключі та значення за допомогою AES-256 GCM. Процес налаштування мінімальний: getSharedPreferences замінюється на EncryptedSharedPreferences.create з вказівкою майстер-ключа з Android Keystore.

Підсумки

  • SharedPreferences — вбудоване ключ-значення сховище Android для збереження простих налаштувань додатку в XML-форматі.
  • Підтримує шість типів даних: String, Int, Boolean, Float, Long та Set<String> із завданням значення за замовчуванням.
  • Операції читання виконуються з пам'яті (кеш), запис — через Editor з синхронним commit або асинхронним apply.
  • Дані ізольовані за ім'ям файлу та MODE_PRIVATE режимом, доступні лише всередині додатку, що їх створив.
  • Для зберігання чутливих даних використовуйте EncryptedSharedPreferences з шифруванням AES-256.
  • Для нових проектів Google рекомендує DataStore як сучасну асинхронну альтернативу з корутинами та Flow.
  • SharedPreferences залишається найкращим вибором для швидкого збереження 5–50 простих налаштувань без додаткових залежностей.

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також