В чем разница Application Context и Activity Context
Что проверяют
Понимаете ли вы, что разница во времени жизни, и знаете ли, где какой брать, чтобы не получить утечку.
Как отвечать
Оба это Context, то есть доступ к ресурсам, системным службам и запуску компонентов. Различаются временем жизни и возможностями.
Activity Context живёт ровно столько, сколько живёт экран, и уничтожается при повороте, при уходе назад, при нехватке памяти. Только он умеет то, что связано с интерфейсом:
- показать диалог:
AlertDialogтребует контекст активити, с контекстом приложения он упадёт или получит системную тему вместо вашей; - раздуть разметку с правильной темой и стилями, потому что тема привязана к активити;
- запустить активити без флага новой задачи.
Application Context живёт всё время работы процесса. Берётся через applicationContext или в наследнике Application.
Правило простое: если объект живёт дольше экрана, ему нужен контекст приложения. Синглтоны, репозитории, база данных Room, клиент сети, WorkManager, менеджеры системных служб. Иначе ссылка на активити останется в долгоживущем объекте, экран не соберётся сборщиком, и это классическая утечка памяти в Android. Особенно опасно статическое поле с контекстом активити: оно удержит экран навсегда.
Обратное тоже верно: подставлять контекст приложения туда, где нужен интерфейс, нельзя. Диалог, надувание разметки со стилями и получение размеров экрана требуют активити.
Полезно знать про третий вариант: Context фрагмента через requireContext() фактически контекст активити и живёт по правилам представления фрагмента, поэтому его тоже нельзя запоминать надолго.
Где спотыкаются
Хранят контекст активити в статическом поле или синглтоне.
Показывают диалог с контекстом приложения и ловят падение.
Считают, что applicationContext подходит везде.
Передают контекст в конструктор долгоживущего объекта, не задумываясь, какой именно.