为什么要为ApplicationContext对象添加注解@ApplicationContext?

Why should I add the annotation @ApplicationContext for an ApplicationContext object?

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

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

发现代码A在appContext: Context之前加注解@ApplicationContext,代码B在private val activity: FragmentActivity前加注解none,为什么?

我可以使用代码 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 {
       ...
    }
  
}

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

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

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