← Назад к вопросам

Что такое @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
}

Преимущества использования

  1. Контроль жизненного цикла — зависимость автоматически уничтожается с Activity
  2. Оптимизация памяти — избегаем создания дублирующихся объектов
  3. Синглтон на уровне Activity — один объект переиспользуется для всех компонентов Activity
  4. Явность кода — @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-приложениях.