Android Studio: уроки на Kotlin. SharedPreferences.

Почти в любом приложении нужно запоминать простые вещи: включена ли тёмная тема, какой язык выбран, показывать ли приветствие при следующем запуске. Для таких маленьких данных в Android есть встроенное хранилище SharedPreferences, работающее по принципу «ключ-значение». В этом уроке из цикла Android Studio Kotlin уроки мы разберём, как записать туда данные и прочитать их обратно, даже после перезапуска приложения.


Что такое SharedPreferences и когда его применять

SharedPreferences — это файл, который система создаёт для вашего приложения и в который можно складывать пары «ключ — значение». Сохранил строку под ключом "username" — и она останется там, пока вы её не перезапишете или не удалите приложение. Подходит только для примитивных типов: чисел, строк, булевых значений. Для списков, баз данных или больших объёмов существуют другие инструменты — Room, файлы JSON.

Идеальный сценарий: при первом запуске вы спрашиваете имя пользователя, записываете его в SharedPreferences, а при следующих запусках сразу показываете приветствие, не задавая вопрос заново.


Получение доступа к хранилищу

В Activity или Fragment достаточно вызвать getSharedPreferences() или использовать делегат PreferenceManager.getDefaultSharedPreferences(). Разница небольшая: первый позволяет задать имя файла, второй даёт стандартное хранилище, привязанное к приложению.

val prefs = getSharedPreferences("my_app_prefs", MODE_PRIVATE)
// или
val defaultPrefs = PreferenceManager.getDefaultSharedPreferences(this)

Режим MODE_PRIVATE означает, что только ваше приложение имеет доступ к этому файлу — другие программы его не прочитают.


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

Чтобы записать значение, нужно открыть редактор, поместить в него пару и применить изменения. Редактор не сохраняет данные сразу, а ждёт вызова apply() (асинхронно) или commit() (синхронно, возвращает успех/неудачу). Для большинства случаев подойдёт apply().

val prefs = getSharedPreferences("my_app_prefs", MODE_PRIVATE)
prefs.edit()
    .putString("username", "Андрей")
    .putInt("age", 25)
    .putBoolean("dark_mode", true)
    .apply()

Ключи всегда строки, а значения — базовых типов. Есть методы для Int, Float, Long, Boolean, String и Set.


Чтение сохранённых данных

Чтение ещё проще: вызываете соответствующий get-метод и указываете значение по умолчанию, которое вернётся, если ключ ещё не был записан.

val username = prefs.getString("username", "Гость") ?: "Гость"
val age = prefs.getInt("age", 0)
val darkMode = prefs.getBoolean("dark_mode", false)

Теперь при первом запуске username будет «Гость», потому что ключ ещё пуст, а после ввода имени и повторного открытия — то, что сохранили.


Удаление и очистка

Удалить отдельный ключ можно через remove(). Чтобы полностью очистить хранилище, используйте clear(). Обе операции требуют вызова apply().

prefs.edit().remove("username").apply()
prefs.edit().clear().apply()

Создание экрана настроек

Теперь давайте соберём маленькое приложение, которое умеет запоминать имя пользователя и переключать тёмную тему. Создадим два элемента: поле ввода и переключатель. Их состояние будем сохранять в SharedPreferences и восстанавливать при запуске.

class SettingsActivity : AppCompatActivity() {
    private lateinit var prefs: SharedPreferences

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_settings)

        prefs = getSharedPreferences("settings", MODE_PRIVATE)

        val etName = findViewById<EditText>(R.id.etName)
        val switchDark = findViewById<Switch>(R.id.switchDark)

        // восстанавливаем сохранённые значения
        etName.setText(prefs.getString("username", ""))
        switchDark.isChecked = prefs.getBoolean("dark_mode", false)

        // сохраняем при изменениях
        etName.addTextChangedListener {
            prefs.edit().putString("username", it.toString()).apply()
        }
        switchDark.setOnCheckedChangeListener { _, isChecked ->
            prefs.edit().putBoolean("dark_mode", isChecked).apply()
        }
    }
}

Теперь закройте приложение и откройте снова — всё осталось на своих местах. Это основа для любого экрана с настройками.


Когда использовать, а когда нет

SharedPreferences — отличный выбор для флагов, токенов, настроек интерфейса. Но не стоит класть туда пароли в открытом виде (для этого есть EncryptedSharedPreferences) или большие списки объектов (берите Room). Также помните, что данные хранятся на устройстве и не синхронизируются с сервером.


Коротко об освоенном

  • SharedPreferences — это локальное хранилище пар «ключ-значение».
  • Запись происходит через edit() и apply().
  • Чтение — через get-методы с указанием значения по умолчанию.
  • Данные сохраняются между запусками приложения и переживают выключение телефона.
  • Идеально для пользовательских настроек и простых флагов.

Сегодняшний урок из цикла Android Studio Kotlin уроки научил вас работать с SharedPreferences. Теперь вы можете сделать так, чтобы ваше приложение запоминало предпочтения пользователя и не задавало одни и те же вопросы при каждом запуске. Обязательно попрактикуйтесь: добавьте в свой проект экран настроек с несколькими опциями и убедитесь, что всё восстанавливается после перезапуска.