为什么要为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 子类型。
代码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 子类型。