Android 匕首-如何在服务和碎片之间共享提供的对象?

Android 匕首-如何在服务和碎片之间共享提供的对象?,android,dagger,Android,Dagger,我试图通过此模块提供CarFactory,以便我可以使用Service和Fragment之间的CarFactory对象 @Module(includes = UnscopedModule.class) public final class ThisModuleModule { @Provides @ServiceScope static CarFactory provideCarFactory() { return new CarFactory();

我试图通过此模块提供
CarFactory
,以便我可以使用
Service
Fragment
之间的
CarFactory
对象

@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
可以同时注入
服务
片段
——基本上在两个不同的范围内共享一个对象?如果我在
@ServiceScope
下面添加
@FragmentScope
,它会说
不能使用多个@Scope


我是否必须将其设置为@ApplicationScope才能从服务和片段访问它?

是的,我建议将其设置为@ApplicationScope

当您阅读“scope”时,可以将其视为“Dagger管理的生命周期”:@FragmentScope意味着只要片段存在,Dagger就会使您的对象保持活动状态,并且每个新片段实例都会获得每个@FragmentScope对象的新副本。对于@ServiceScope也是如此:每个服务实例都将存在一个@ServiceScope对象或绑定,理想情况下,一旦服务被销毁,就会进行垃圾收集。当然,就安卓而言,片段和服务可能有重叠的生命周期,彼此之间没有联系

出于这个原因,同时使用@FragmentScope和@ServiceScope是没有意义的:您希望对象的寿命比片段和服务都长,以便在两者之间共享。这通常意味着您希望它位于@Singleton范围内,@ApplicationScope通常是Dagger中的同义词

请注意,这意味着@Singleton或@ApplicationScope中的对象永远不会被垃圾收集,因为Dagger会将它们保留足够长的时间,以便您的片段和服务始终获得相同的实例。因此,尽量减少在这些范围内的内容以保持较低的内存使用率是很重要的