使用 Dagger 2 注入服务
Using Dagger 2 to inject into service
我有一个应用程序,它基本上是一个一直运行的服务,并在发生某些事情时向用户发出警报。
当服务创建警报时,它需要给它他的 context
以便警报可以在发生某些事情时对服务进行回调。
例如:
public MyService extends Service{
private SomeAlarm alarm;
@Override
public void onCreate() {
super.onCreate();
alarm = new SomeAlarm(MyService.this);
}
}
如何将 SomeAlarm
class 注入到服务中,并将服务上下文作为变量提供给 SomeAlarm
?
我是凭着头脑写的代码,所以可能会有一两个错字。
您的操作与将内容注入活动时相同。
- 声明一个组件,
- 将注入方法添加到该组件,
- 添加一个提供您的服务的模块
- 创建组件生成器
- 将您的模块添加到构建器
- 使用组件注入您的服务
您的模块和组件看起来像这样(可能添加一些范围)
@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);
}
然后在 onCreate
中创建您的组件并注入警报。
@Inject
private SomeAlarm alarm;
public void onCreate() {
DaggerMyServiceComponent.builder()
.serviceModule(new ServiceModule(this))
.build()
.inject(this);
alarm.doStuff();
}
这是假设您的警报可以通过 @Inject
带注释的构造函数注入构造函数,如下所示:
class SomeAlarm {
@Inject
SomeAlarm(MyService service) {
/*constructor stuff*/
}
}
否则您也可以将警报创建添加到您的模块中。
我知道这个问题已经有了答案,但还有其他方法可以做到这一点
首先使您的应用程序像这样扩展 HasServiceInjector
:
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;
}
}
然后创建一个 ServiceBuilderModule
这将对服务执行注入:
@Module
abstract class ServiceBuilderModule {
@ContributesAndroidInjector
abstract MyService contributeMyService();
}
然后将新模块注册到您的 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);
}
然后覆盖您服务的 onCreate
方法并添加 AndroidInjection.inject(this)
像下面的代码:
public class MyService extends Service {
@Override
public void onCreate() {
AndroidInjection.inject(this);
super.onCreate();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
kotlin
中的代码是上述代码的精确转换。希望这对以后的一些编码人员有所帮助。
我有一个应用程序,它基本上是一个一直运行的服务,并在发生某些事情时向用户发出警报。
当服务创建警报时,它需要给它他的 context
以便警报可以在发生某些事情时对服务进行回调。
例如:
public MyService extends Service{
private SomeAlarm alarm;
@Override
public void onCreate() {
super.onCreate();
alarm = new SomeAlarm(MyService.this);
}
}
如何将 SomeAlarm
class 注入到服务中,并将服务上下文作为变量提供给 SomeAlarm
?
我是凭着头脑写的代码,所以可能会有一两个错字。
您的操作与将内容注入活动时相同。
- 声明一个组件,
- 将注入方法添加到该组件,
- 添加一个提供您的服务的模块
- 创建组件生成器
- 将您的模块添加到构建器
- 使用组件注入您的服务
您的模块和组件看起来像这样(可能添加一些范围)
@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);
}
然后在 onCreate
中创建您的组件并注入警报。
@Inject
private SomeAlarm alarm;
public void onCreate() {
DaggerMyServiceComponent.builder()
.serviceModule(new ServiceModule(this))
.build()
.inject(this);
alarm.doStuff();
}
这是假设您的警报可以通过 @Inject
带注释的构造函数注入构造函数,如下所示:
class SomeAlarm {
@Inject
SomeAlarm(MyService service) {
/*constructor stuff*/
}
}
否则您也可以将警报创建添加到您的模块中。
我知道这个问题已经有了答案,但还有其他方法可以做到这一点
首先使您的应用程序像这样扩展 HasServiceInjector
:
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;
}
}
然后创建一个 ServiceBuilderModule
这将对服务执行注入:
@Module
abstract class ServiceBuilderModule {
@ContributesAndroidInjector
abstract MyService contributeMyService();
}
然后将新模块注册到您的 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);
}
然后覆盖您服务的 onCreate
方法并添加 AndroidInjection.inject(this)
像下面的代码:
public class MyService extends Service {
@Override
public void onCreate() {
AndroidInjection.inject(this);
super.onCreate();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
kotlin
中的代码是上述代码的精确转换。希望这对以后的一些编码人员有所帮助。