I'm trying to add a singleton Manager into an Android Service. The problem is that the injected manager is not the same as 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;
}
}
Declaring PeerManager:
@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 that the ViewModel.mPeersManager
is different than OpportunisticService.mPeersManager
, and I would expect them to be the same given that the PeersManager
is marked as singleton.
I expect this to happen because of the different AndroidInjector
s for Activity
/Fragment
and for Service
.