Using Dagger 2 to inject into service
I know this question already has an answer but there are an other way to do this
first make your application extend HasServiceInjector
like this:
public class App extends Application implements HasActivityInjector,
HasServiceInjector {
@Inject
DispatchingAndroidInjector<Activity> dispatchingActivityInjector;
@Inject
DispatchingAndroidInjector<Service> dispatchingServiceInjector;
@Override
public void onCreate() {
super.onCreate();
AppInjector.init(this);
}
@Override
public AndroidInjector<Activity> activityInjector() {
return dispatchingActivityInjector;
}
@Override
public AndroidInjector<Service> serviceInjector() {
return dispatchingServiceInjector;
}
}
then create a ServiceBuilderModule
this will perform injection over services:
@Module
abstract class ServiceBuilderModule {
@ContributesAndroidInjector
abstract MyService contributeMyService();
}
then register the new module to your component
@Component(modules = {
AndroidSupportInjectionModule.class,
AppModule.class,
ActivityBuilderModule.class,
ServiceBuilderModule.class
})
@Singleton
public interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(App application);
AppComponent build();
}
void inject(App app);
}
then override the onCreate
method of your service and add AndroidInjection.inject(this)
like below code :
public class MyService extends Service {
@Override
public void onCreate() {
AndroidInjection.inject(this);
super.onCreate();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
code in kotlin
is exact conversion of the code above. hope this helps some coders from now on.
I wrote the code from the top of my head, so there could be a typo or two.
You do it just the same as when injecting stuff into activities.
- Declare a component,
- add the inject method to that component,
- add a module providing your service
- create that components builder
- add your module to the builder
- inject your service with the component
Your module and component would look something like this (maybe add some scope)
@Module
class ServiceModule {
MyService mService;
ServiceModule(MyService service) {
mService = service;
}
@Provides
MyService provideMyService() {
return mService;
}
}
@Component(modules=ServiceModule.class)
interface MyServiceComponent {
void inject(MyService service);
}
Then in onCreate
just create your component and inject your alarm.
@Inject
private SomeAlarm alarm;
public void onCreate() {
DaggerMyServiceComponent.builder()
.serviceModule(new ServiceModule(this))
.build()
.inject(this);
alarm.doStuff();
}
This is assuming that your alarm can be constructor injected by having an @Inject
annotated constructor like this:
class SomeAlarm {
@Inject
SomeAlarm(MyService service) {
/*constructor stuff*/
}
}
Else you would just also add the alarm creation to your module.