首页 > 解决方案 > 为什么要为 ApplicationContext 对象添加注解 @ApplicationContext?

问题描述

代码 A 来自https://developer.android.com/codelabs/android-hilt#6

代码 B 来自https://developer.android.com/codelabs/android-hilt#7

我发现代码A中的appContext:Context之前添加了注释@ApplicationContext,而代码B中的私有val活动:FragmentActivity之前没有添加注释,为什么?

还有更多我可以使用代码 C 而不是代码 A 吗?

代码 A

@Module
object DatabaseModule {

    @Provides
    @Singleton
    fun provideDatabase(@ApplicationContext appContext: Context): AppDatabase {
       ...
    }
  
}

代码 B

class AppNavigatorImpl @Inject constructor(
    private val activity: FragmentActivity
) : AppNavigator {
    ...
}

代码 C

@Module
object DatabaseModule {

    @Provides
    @Singleton
    fun provideDatabase(appContext: ApplicationContext): AppDatabase {
       ...
    }
  
}

标签: kotlindependency-injectiondagger-hilt

解决方案


单身人士比活动更长寿。由于 Activity 是 Context 的子类型,如果将其传递给挂在引用上的单例(只是将其用作 Context),则该 Activity 已被泄露。这@ApplicationContext是一个指示,您应该只将应用程序上下文作为函数的参数传递。应用程序上下文在应用程序的生命周期内是恒定的,因此它是防泄漏的。

注释是一种记录您不应将活动作为上下文传递的方式,但如果您不小心这样做了,Lint 也会警告您。

代码 C没有意义,因为您已经创建了 ApplicationContext 类型的参数,它是一个注释类,而不是 Context 子类型。


推荐阅读