代码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子类型。