Ответ
Объекты, помеченные аннотацией @Scope в Dagger, живут столько же, сколько и компонент, к которому привязана эта область видимости. Например:
@Singleton— живет, пока существуетApplicationComponent(обычно весь жизненный цикл приложения).@ActivityScope— живет, пока активна Activity (уничтожается приonDestroy()).@FragmentScope— живет, пока существует Fragment (уничтожается приonDestroy()).
Пример:
@Module
class AppModule {
@Singleton
@Provides
fun provideHeavyDependency(): HeavyDependency = HeavyDependency()
}
Здесь HeavyDependency будет существовать, пока живет ApplicationComponent.
Ответ 18+ 🔞
А, ну это же про Dagger и его скопы! Ёпта, вечная тема для путаницы, но на самом деле всё проще пареной репы, если разобраться.
Смотри, представь, что твой компонент — это такой большой барак, а объекты в нём — это жильцы. Аннотация @Scope — это просто бумажка на двери, которая говорит, сколько этот жилец может тут продержаться. Пока барак стоит — жилец живёт. Барак разобрали — все, кто в нём был, на выход.
Вот смотри на классику:
@Singleton— это дед, который поселился в главном,ApplicationComponent. Этот барак-приложение сносится только когда ты весь апп целиком закрываешь. Вот пока апп живёт — и дед живёт. Удобно для всякой тяжёлой хуйни, которая нафиг не нужна каждый раз создаваться заново.@ActivityScope— это уже сосед по квартире в баракеActivityComponent. Активность уничтожили (onDestroy()), барак снесли — соседа, вместе со всеми его зависимостями, нахуй выкинули, память почистили.@FragmentScope— ну это вообще мелкий, живёт в своей каморкеFragmentComponent. Фрагмент приказал долго жить — и вся его мелочёвка, помеченная этой скопой, отправилась в digital-небытие.
Вот тебе пример, чтобы вообще всё стало ясно, как божий день:
@Module
class AppModule {
@Singleton
@Provides
fun provideHeavyDependency(): HeavyDependency = HeavyDependency()
}
Видишь? HeavyDependency помечен как @Singleton. Это какой-нибудь здоровенный клиент ретрофита или база данных. Создали его один раз, когда ApplicationComponent собрали, и он теперь будет жить, пока жив сам компонент приложения. То есть, практически, всегда. Это чтобы он не создавался, как дурак, на каждый чих, а то жрёт ресурсов — овердохуища.
Короче, правило простое, как три копейки: срок жизни объекта = срок жизни компонента, в котором он зарегистрирован. Привязал зависимость к скопе активити — получил её на всю жизнь активити и ни минутой дольше. Всё гениальное — просто, ёпта. Главное — не навешивай @Singleton на то, что должно жить только пока экран открыт, а то будет тебе не оптимизация, а манда с ушами, которая память жрёт просто зазря.