Hilt SingletonComponent 与 ActivityComponent 范围

问题描述 投票:0回答:1

我有一个包含三项活动的应用程序。 启动活动 A -> 活动 B -> 活动 -> C

上一个活动已完成,同时导航到下一个活动。

我通过以下方式在 Activity A 和 Activity B 中注入对象


@Module
@InstallIn(SingletonComponent::class)
class MyProvider {

   // Provides object in Activity A
   @Provides
   fun provideTheObjectA(): SomeObjectA {
       return SomeObjectA()
   }
}


@Module
@InstallIn(ActivityComponent::class)
class AvtivtyBProvider {

  // Provides object in Activity B
  @Provides
  fun provideTheObjectB(): SomeObjectB {
      return SomeObjectB()
  }
}

class ActivtyA: AppCompatActivity(){

  @Inject
  SomeObjectA
}

class ActivtyB: AppCompatActivity(){

  @Inject
  SomeObjectB
}

我想了解这里SingletonComponent和ActivityComponent的区别。

那么,

  1. 当 Activity A 被销毁时,对象 A 是否也会被销毁? (它在 SingletonComponent 范围下生成)(注意:我没有使用 @Singleton 注释 )我相信它会被销毁/垃圾收集。
  2. 如果我提供了 @Singleton 注释,我假设即使活动 A 被销毁,对象 A 也不会被销毁/垃圾收集。

如果是这样,如果我没有使用@Singleton注解,@SingletonComponent有什么意义?

  1. 我假设当 Activity B 被销毁时,对象 B 也会被销毁/垃圾收集。

  2. 我在创建对象 B 的实例时没有使用@ActivtyScoped。这有什么区别?

  3. 仅拥有 @Provides 注释而没有任何范围最终意味着什么

android kotlin dagger-2 dagger-hilt
1个回答
0
投票

SingletonComponent
ActivityComponent
是范围的定义。

注意:在 @InstallIn 模块内确定绑定的范围时,范围 绑定必须与组件的范围相匹配。例如,一个 @InstallIn(ActivityComponent.class) 模块内的绑定只能 使用 @ActivityScoped 确定范围。

就你而言,

SomeObjectB
不可能是
@Singleton
,只能是
@ActivityScoped

组件的生命周期通常受到创建和创建的限制 销毁 Android 类的相应实例。

    1. 没有任何范围的
    2. @Provides
      将在您注入时创建一个新对象。
      @Provides
      仅在模块
      @Module
      中使用。这就是没有范围的要点。
    1. 参见 5。
    1. 是的,因为它不是
      @Singleton
    1. 是的。
    1. 是的,会的。重点是您也可以在
      ObjectA
      中请求
      ActivityB
      (以及应用程序中的任何地方)
© www.soinside.com 2019 - 2024. All rights reserved.