Dagger 2:DaggerBroadcastReceiver 重新创建 Subcomponent

Dagger 2: DaggerBroadcastReceiver recreates Subcomponent

假设我想要 SomeSingletonClass 的单个应用程序范围的实例。我创建了一个提供此类对象的 Dagger 模块:

@Module
public interface MyModule {

    @Provider
    @Singleton
    SomeSingletonClass provideSomeSingletonClass() {
       return new SomeSingletonClass();
    }
    

我也想用BroadcastReciever:

public class MyReceiver extends DaggerBroadcastReceiver {

    @Inject
    SomeSingletonClass someSingletonClass;

    @Override
    public void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);
        ...
    }
}

它有自己的模块:

@Module
public abstract class MyReceiverModule {
    @Singleton
    @ContributesAndroidInjector(modules = {MyModule.class})
    abstract MyReceiver myReceiver();
}

现在,每次调用 onReceive() 都会导致调用 super.onReceive(),后者又会调用 AndroidInjection.inject(this, context)。这会导致重新创建 MyReceiver 的子组件和关联的依赖项,包括 SomeSingletonClass.

使用 DaggerBroadcastReceiver 时保留单例实例的正确方法是什么?

好的,我的问题是我将 @Singleton 添加到 @ContributesAndroidInjector 创建的子组件中。正如 gk5885 在 answer 中指出的类似问题:

@Subcomponents cannot be made @Singleton.

原因是,由于子组件可能会被组件重新创建,@Singleton 实例将只对子组件实例保持不变。解决方案是从子组件中删除 @Singleton 注释,并为根组件提供单例的移动模块,然后将其标记为 @Singleton.