使用 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

我是凭着头脑写的代码,所以可能会有一两个错字。

您的操作与将内容注入活动时相同。

  1. 声明一个组件,
  2. 将注入方法添加到该组件,
  3. 添加一个提供您的服务的模块
  4. 创建组件生成器
  5. 将您的模块添加到构建器
  6. 使用组件注入您的服务

您的模块和组件看起来像这样(可能添加一些范围)

@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中的代码是上述代码的精确转换。希望这对以后的一些编码人员有所帮助。