← Назад к вопросам
Что такое @ActivityScope в Dagger?
2.0 Middle🔥 201 комментариев
#Dependency Injection#Архитектура и паттерны
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое @ActivityScope в Dagger
@ActivityScope — это custom scope аннотация в Dagger, которая определяет жизненный цикл зависимостей на уровне Activity. Это инструмент для управления временем жизни объектов в контексте Android-приложения.
Основные концепции
Scope в Dagger — это механизм, который гарантирует, что зависимость будет создана один раз и переиспользоваться в пределах определённого контекста. @ActivityScope означает, что объект живёт столько же, сколько живёт Activity.
Как работает @ActivityScope
@Scope
@Retention(AnnotationRetention.RUNTIME)
public annotation class ActivityScope
Эта аннотация используется для маркирования компонентов и провайдеров:
@ActivityScope
@Component(modules = [ActivityModule::class])
interface ActivityComponent {
fun inject(activity: MainActivity)
}
@ActivityScope
class UserRepository(
private val apiService: ApiService,
private val database: AppDatabase
) {
// Этот объект будет создан один раз на Activity
}
Преимущества использования
- Контроль жизненного цикла — зависимость автоматически уничтожается с Activity
- Оптимизация памяти — избегаем создания дублирующихся объектов
- Синглтон на уровне Activity — один объект переиспользуется для всех компонентов Activity
- Явность кода — @ActivityScope показывает намерение разработчика
Пример использования
@Module
class ActivityModule {
@ActivityScope
@Provides
fun provideUserRepository(apiService: ApiService): UserRepository {
return UserRepository(apiService)
}
}
@ActivityScope
@Component(modules = [ActivityModule::class])
interface ActivityComponent {
fun inject(activity: MainActivity)
}
class MainActivity : AppCompatActivity() {
@Inject
lateinit var userRepository: UserRepository
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
DaggerActivityComponent.create().inject(this)
// userRepository теперь инициализирован
}
}
Различие со стандартными scope
- @Singleton — объект живёт столько же, сколько приложение
- @ActivityScope — объект живёт столько же, сколько Activity
- Unsoped — новый объект создаётся каждый раз
Важные замечания
Чтобы @ActivityScope работал, нужно убедиться:
- Аннотация определена с @Scope
- Компонент помечен @ActivityScope
- Все провайдеры внутри компонента также помечены @ActivityScope
- Жизненный цикл Activity соблюдается (создание/уничтожение)
Это критично для управления памятью и избежания утечек в Android-приложениях.