How to enter singleton in Android service using dagger 2

I am trying to add singleton manager to android service. The problem is that the injected manager does not match the one in the ViewModel.

Dagger component

@Singleton
@Component(modules = {ApplicationModule.class, AppScreenModule.class, ServiceModule.class})
public interface AppComponent {

    void inject(App application);

    void inject(OpportunisticService opportunisticService);

    @Component.Builder
    interface Builder {
        AppComponent build();

        Builder applicationModule(ApplicationModule applicationModule);
    }
}

Modules

@Module
class ApplicationModule {    
    private final App mApp;

    ApplicationModule(App app) {
        mApp = app;
    }

    @Provides
    @Named("ApplicationContext")
    Context provideContext() {
        return mApp.getApplicationContext();
    }

    @Provides
    App provideApplication() {
        return mApp;
    }

    @Provides
    PeersManager providePeersManager() {
        return new PeersManager();
    }
}

@Module
abstract class ServiceModule {

    @ContributesAndroidInjector
    abstract OpportunisticService bindOpportunisticService();
}

Initialization

public class Components {
    private static AppComponent sComponent;

    public static void initialize(App app) {
        // Initialize the AppComponent
        Preconditions.checkState(sComponent == null, "AppComponent already initialized");
        sComponent = DaggerAppComponent.builder()
                                       .applicationModule(new ApplicationModule(app))
                                       .build();
    }

    public static AppComponent app() {
        if (BuildConfig.DEBUG)
            Preconditions.checkState(sComponent == null, "AppComponent not initialized");
        return sComponent;
    }
}

public class App extends Application implements HasActivityInjector, HasServiceInjector {
    @Inject
    DispatchingAndroidInjector<Activity> mActivityDispatchingAndroidInjector;

    @Inject
    DispatchingAndroidInjector<Service> mServiceDispatchingAndroidInjector;

    @Override
    public void onCreate() {
        super.onCreate();

        // Initialize the AppComponent
        Components.initialize(this);
        Components.app().inject(this);
    }

    @Override
    public AndroidInjector<Activity> activityInjector() {
        return mActivityDispatchingAndroidInjector;
    }

    @Override
    public AndroidInjector<Service> serviceInjector() {
        return mServiceDispatchingAndroidInjector;
    }
}

PeerManager Announcement :

@Singleton
public class PeersManager {

    @Inject
    public PeersManager() {
    }
}

Using PeersManager :

public class ViewModel {
    private final PeersManager mPeersManager;

    @Inject
    public ViewModel (PeersManager peersManager) {
        mPeersManager = peersManager;
    }
}

public class OpportunisticService extends Service {
    @Inject
    PeersManager mPeersManager;

    @Override
    public void onCreate() {
        super.onCreate();
        AndroidInjection.inject(this);
    }
}

The problem is what ViewModel.mPeersManageris different from OpportunisticService.mPeersManager, and I would expect them to be the same if PeersManagerchecked as singleton.

I expect this to happen due to different AndroidInjectorfor Activity/ Fragmentand for Service.

+6
source share

No one has answered this question yet.


All Articles