为什么要为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中的private val activity: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 {
...
}

}

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

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

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

最新更新