我试图通过这个模块提供CarFactory
,以便我可以在CarFactory
和Service
之间使用Fragment
对象。
@Module(includes = UnscopedModule.class)
public final class ThisModuleModule {
@Provides
@ServiceScope
static CarFactory provideCarFactory() {
return new CarFactory();
}
@Provides
@ServiceScope
static String provideReferrer() {
return "referrer";
}
}
对于初始实现,我可以将CarFactory
注入Service
,但显然我无法将其注入Fragment
,因为provideCarFactory
绑定到@ServiceScope。我怎样才能使CarFactory
注入Service
和Fragment
- 基本上在两个不同的范围内共享一个对象?如果我在@FragmentScope
下面添加@ServiceScope
,它说Cannot use more than one @Scope
...
我是否必须使它@ApplicationScope使其可以从服务和片段访问?
是的,我建议将其制作成@ApplicationScope。
当您阅读“范围”时,将其视为“Dagger管理的生命周期”:@ FraragScope意味着只要Fragment存在,Dagger就会使您的对象保持活动状态,并且每个新的Fragment实例都会获得每个@FragmentScope事物的新副本。同样,对于@ServiceScope:每个Service实例都存在一个@ServiceScope对象或绑定,理想情况下,一旦服务被销毁,它将被垃圾收集。当然,就Android而言,碎片和服务可能具有重叠的生命周期,这些生命周期彼此无关。
出于这个原因,同时出现@FragmentScope和@ServiceScope是没有意义的:你希望对象比片段和服务更长寿,以便它们在两者之间共享。这通常意味着您希望它位于@Singleton范围内,@ ApplicationScope通常是Dagger中的同义词。
请注意,这意味着@Singleton或@ApplicationScope中的对象永远不会被垃圾收集,因为Dagger会将它们保持足够长的时间,以使您的Fragment和Service始终获得相同的实例。因此,最大限度地减少放在这些宽范围内的内容以保持低内存使用率非常重要。