SharedPreferences
Сохраняйте простые данные в формате «ключ — значение» между сеансами приложения с помощью SharedPreferences. Научитесь сохранять, читать и удалять настройки.
«SharedPreferences» — бесплатный урок Android Academy на CoddyKit. Это урок 4 из 6. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Android Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Android Academy содержит 6 уроков всего.
Варианты постоянного хранения данных
Android предоставляет несколько способов локального хранения данных:
- SharedPreferences — простые пары «ключ–значение» (настройки, токены)
- Room — структурированная база данных SQLite (сложные данные)
- DataStore — современная асинхронная замена SharedPreferences
- Файлы — необработанные операции ввода-вывода с файлами
SharedPreferences идеально подходит для простых настроек и пользовательских предпочтений.
Что такое SharedPreferences?
SharedPreferences хранит данные в виде пар «ключ–значение» в XML-файле на устройстве. Поддерживаются:
- String
- Int / Long / Float
- Boolean
- Set<String>
Данные сохраняются после перезапуска приложения и переживают изменения конфигурации (поворот экрана).
Получение экземпляра SharedPreferences
Есть два способа получить объект SharedPreferences:
// 1. Named preferences (shared across activities)
val prefs = getSharedPreferences(
"MyAppPrefs", // file name
Context.MODE_PRIVATE // only your app can read it
)
// 2. Activity's default preferences
val prefs = getPreferences(Context.MODE_PRIVATE)Запись данных
Используйте Editor для записи значений, затем вызовите apply():
val prefs = getSharedPreferences("MyAppPrefs", Context.MODE_PRIVATE)
prefs.edit()
.putString("username", "alice")
.putInt("login_count", 5)
.putBoolean("dark_mode", true)
.apply() // async, non-blocking — preferred over commit()
// Kotlin extension (cleaner syntax):
with(prefs.edit()) {
putString("username", "alice")
apply()
}Чтение данных
Читайте значения по ключу, указывая значение по умолчанию, если ключ не существует:
val prefs = getSharedPreferences("MyAppPrefs", Context.MODE_PRIVATE)
val username = prefs.getString("username", "Guest") // default: "Guest"
val count = prefs.getInt("login_count", 0) // default: 0
val darkMode = prefs.getBoolean("dark_mode", false) // default: false
println("Hello, $username! Logins: $count. Dark: $darkMode")Практический пример: переключатель темы
Сохраните и восстановите настройку тёмного режима:
class SettingsActivity : AppCompatActivity() {
private lateinit var binding: ActivitySettingsBinding
private lateinit var prefs: SharedPreferences
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivitySettingsBinding.inflate(layoutInflater)
setContentView(binding.root)
prefs = getSharedPreferences("settings", MODE_PRIVATE)
// Restore saved state
binding.switchDarkMode.isChecked = prefs.getBoolean("dark_mode", false)
binding.switchDarkMode.setOnCheckedChangeListener { _, isChecked ->
prefs.edit().putBoolean("dark_mode", isChecked).apply()
}
}
}Сохранение токена входа
Сохраняйте и проверяйте токен авторизации после перезапуска приложения:
// Save token after login
fun saveToken(token: String) {
getSharedPreferences("auth", MODE_PRIVATE)
.edit()
.putString("token", token)
.apply()
}
// Check if user is logged in
fun isLoggedIn(): Boolean {
val token = getSharedPreferences("auth", MODE_PRIVATE)
.getString("token", null)
return token != null
}
// Clear on logout
fun logout() {
getSharedPreferences("auth", MODE_PRIVATE)
.edit()
.remove("token")
.apply()
}Удаление и очистка данных
Удаляйте отдельные ключи или стирайте все данные:
.remove("key")— удалить одну запись.clear()— удалить всё содержимое файла
Всегда вызывайте .apply() (или .commit(), если требуется синхронное подтверждение).
SharedPreferences и DataStore
SharedPreferences работает нормально, но имеет ограничения:
- Синхронное чтение может блокировать главный поток
- Отсутствует проверка типов
Jetpack DataStore — современная замена, полностью асинхронная и поддерживающая Kotlin Flow и проверку типов. В новых проектах отдавайте предпочтение DataStore. SharedPreferences по-прежнему широко используется и вполне подходит для небольших объёмов данных.
Быстрая проверка
Какой метод асинхронно сохраняет данные в SharedPreferences, не блокируя поток пользовательского интерфейса?
Итоги: SharedPreferences
Теперь вы умеете сохранять простые данные между запусками приложения:
- Получение:
getSharedPreferences(name, MODE_PRIVATE) - Запись:
.edit().putString(key, value).apply() - Чтение:
.getString(key, defaultValue) - Удаление:
.edit().remove(key).apply() - Используйте
apply()(асинхронный вызов), а неcommit()(синхронный)
Следующий курс: архитектура приложений — ViewModel, Room и Coroutines.
Часто задаваемые вопросы
Урок «SharedPreferences» бесплатный?
Да — полный текст урока «SharedPreferences» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Android Academy, подпишись на CoddyKit PRO. Курс Android Academy содержит 6 уроков всего.
Чему я научусь в уроке «SharedPreferences»?
Сохраняйте простые данные в формате «ключ — значение» между сеансами приложения с помощью SharedPreferences. Научитесь сохранять, читать и удалять настройки. Ты практикуешь Android Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Android Academy?
Предыдущий опыт не требуется. Android Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 6.
Сколько времени занимает урок «SharedPreferences»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Android Academy?
Да. Каждый урок Android Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Коллекции Kotlin
- Основы RecyclerView
- События нажатия в RecyclerView
- SharedPreferences
- Настройки DataStore
- Адаптеры и DiffUtil