Когда происходит уничтожение компонентов с аннотацией Scope
Что проверяют
Понимаете ли вы, что аннотация скоупа в Dagger и Hilt сама ничего не уничтожает: она лишь велит компоненту хранить один экземпляр на всё своё время жизни. Следом обычно спрашивают, что станет с @ActivityScoped-объектом при повороте экрана.
Как отвечать
Скоупленный объект живёт ровно столько, сколько живёт экземпляр компонента, который его закэшировал. Когда на компонент не остаётся ссылок, он и все его объекты становятся обычным мусором для GC. Колбэка «объект уничтожается» Dagger не вызывает.
В чистом Dagger время жизни компонента определяете вы: создали компонент экрана в onCreate, обнулили ссылку в onDestroy. Имя @ActivityScope при этом просто метка, об Activity аннотация ничего не знает.
В Hilt компоненты привязаны к жизненным циклам заранее:
@Singleton:SingletonComponent, живёт вместе сApplication;@ActivityRetainedScoped: создаётся при первомActivity#onCreateи уничтожается при последнемonDestroy, то есть переживает смену конфигурации;@ViewModelScoped: живёт, пока жива конкретнаяViewModel, и уходит вместе с её очисткой;@ActivityScoped: отActivity#onCreateдоonDestroy, при повороте экрана создаётся заново;@FragmentScoped: отFragment#onAttachдоFragment#onDestroy;@ViewScoped: от созданияViewдо её уничтожения;@ServiceScoped: отService#onCreateдоonDestroy.
Если объект держит ресурс (сокет, подписку, файл), закрывайте его сами: в onCleared у ViewModel, через addOnClearedListener у ViewModelLifecycle или ActivityRetainedLifecycle. Уход компонента ресурс не закроет.
Где спотыкаются
Считают, что @Singleton означает «один на всё приложение» при любых условиях. В Dagger это один экземпляр на компонент: создадите компонент дважды, получите два «синглтона».
Хранят данные экрана в @ActivityScoped-объекте и удивляются, что после поворота они пропали. Для этого есть @ActivityRetainedScoped или ViewModel.
Сохраняют объект с короткой жизнью в синглтон или статическое поле. Неверную связь зависимостей Dagger поймает при компиляции, но ручное присваивание не отследит, и Activity утечёт вместе с объектом.