Утечка через синглтон
Context и время жизни объектов
Analytics живёт в процессе и нуждается только в контексте приложения для доступа к файлам; UI, окно и тема Activity ему не нужны. После закрытия последней MainActivity процесс остаётся жив, а новой init больше не происходит. Анализ удерживающих ссылок показывает путь Analytics → context → MainActivity.
Исправь Analytics, не меняя Activity. Повторный init при каждом повороте заменяет ссылку, поэтому сам по себе этот код не доказывает накопление всех старых Activity; проблема — удержание последнего экрана после завершения.
Проверь: закрытый экран не удерживается этим singleton; повторная init с другой Activity хранит контекст процесса; решение не используется как замена контекста для показа диалогов. Context.getApplicationContext.
Сохранённый код превышает предел редактора. Скачай его перед сбросом; исходная запись сохранена.
Singleton переживает конкретную Activity, поэтому его сильная ссылка удерживала экран. В заданном сценарии вход — настоящая Activity, а applicationContext связан с Application текущего процесса. Меняется именно сохраняемая ссылка. Контракт Context.
Это исправление данного пути удержания, а не гарантия отсутствия всех утечек: callback, listener или другая глобальная ссылка всё ещё могут удержать Activity. Контекст экрана нужен операциям с его окном/темой; такие зависимости здесь не сохраняются. Пример разобран по API, Android-запуск не выполнялся.