Перейти к содержанию

Context & Resources

Context предоставляет доступ к возможностям приложения и Android. Система ресурсов выбирает строки, разметку и другие значения с учётом текущей конфигурации.

Контекст

Контекст Activity и приложения

Через Context доступны ресурсы, assets, системные службы, файлы приложения и запуск компонентов. Выбирайте контекст с подходящими временем жизни и конфигурацией интерфейса.

Контекст Activity содержит её тему и конфигурацию окна. Он нужен для создания оформленных темой View, показа диалогов и обращения к ресурсам экрана. В Compose текущий контекст можно получить через LocalContext.current, но для ресурсов, которые должны обновляться при изменении конфигурации, обычно используют stringResource() и аналогичные функции Compose.

Контекст приложения связан с процессом, а не с отдельным экраном. Он подходит для долгоживущей базы данных, DataStore или репозитория, которым нужны службы или файлы приложения. Но у него может не быть темы и конфигурации конкретного окна, необходимых интерфейсу. Передавайте контекст только тем зависимостям, которым он действительно нужен; по возможности выбирайте более узкую зависимость.

Если долгоживущий объект хранит Activity, View или контекст с темой экрана, уничтоженный экран может остаться в памяти. Для работы на уровне процесса используйте applicationContext. Не сохраняйте надолго строки и изображения, зависящие от конфигурации: после смены языка, темы или параметров экрана они могут устареть.

ContextWrapper

ContextWrapper делегирует операции базовому Context и позволяет переопределить отдельное поведение. ContextThemeWrapper добавляет тему для работы с интерфейсом; от него наследуется Activity. Обёртка не делает базовый контекст безопасным для долгого хранения: его время жизни по-прежнему важно.

Если нужны ресурсы для заданной конфигурации, createConfigurationContext() создаёт контекст с этой конфигурацией. Для выбора языка приложения предпочтительны системные API или API AppCompat, а не ручное изменение глобального объекта Resources.

Ресурсы

Ресурсы, конфигурация и ориентация

К ресурсам относятся строки, формы множественного числа, размеры, цвета, изображения и разметка. Android выбирает варианты по квалификаторам вроде values-ru, values-night и layout-land; где необходимо, задавайте значения по умолчанию. Для текста интерфейса используйте getString() или getQuantityString() в Android-коде и stringResource() или pluralStringResource() в Compose, а не строки, жёстко заданные в коде.

Configuration описывает язык, размер экрана, плотность пикселей, ориентацию, ночной режим, масштаб шрифта и другие параметры. Поворот - лишь один из случаев изменения конфигурации; изменение размера окна тоже может повлиять на выбор ресурсов. Android часто пересоздаёт Activity, чтобы интерфейс применил новую конфигурацию. Данные экрана и бизнес-данные держите в подходящем хранилище состояния, а восстанавливаемое состояние интерфейса при необходимости сохраняйте через rememberSaveable, SavedStateHandle или saved instance state. Постоянное хранилище нужно для данных между запусками приложения, а не для обычного поворота экрана.

android:configChanges поручает Activity обрабатывать указанные изменения через onConfigurationChanged() вместо обычного пересоздания. Тогда приложение должно само обновить затронутые View и ресурсы, зависящие от конфигурации. Это не отменяет пересоздание по другим причинам и необходимость учитывать гибель процесса. Подробнее - в руководстве по изменениям конфигурации и руководстве по ресурсам.