【问题标题】:Using Dagger 2 to inject into service使用 Dagger 2 注入服务
【发布时间】:2016-08-31 08:08:59
【问题描述】:

我有一个应用程序,它基本上是一项服务,它始终运行并在发生某些事情时向用户发出警报。

当服务创建警报时,它需要给它context,以便警报可以在发生事情时对服务进行回调

例如:

public MyService extends Service{
    private SomeAlarm alarm;

    @Override
    public void onCreate() {
        super.onCreate();
        alarm = new SomeAlarm(MyService.this);
    }
}

如何将SomeAlarm 类注入到服务中,并将服务上下文作为变量赋予SomeAlarm

【问题讨论】:

    标签: android dependency-injection android-service inversion-of-control dagger-2


    【解决方案1】:

    我知道这个问题已经有了答案,但还有其他方法可以做到这一点

    首先让您的应用程序像这样扩展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 中的代码是上述代码的精确转换。希望这从现在开始对一些编码人员有所帮助。

    【讨论】:

      【解决方案2】:

      我是从头顶写的代码,所以可能有一两个错字。

      您的操作与将内容注入活动时一样。

      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*/
          }
      }
      

      否则,您也只需将警报创建添加到您的模块中。

      【讨论】:

      • 感谢您的回答。当我尝试注入警报时,代码不会编译,说“Builder() 在 Builder 中具有私有访问权限”
      • @OfekAgmon 这就是我在答案中添加第一行的原因。它是DaggerMyServiceComponent.builder()
      • 谢谢,我还需要在 DaggerMyServiceComponent.builder() 之前取出“新”
      • @AdamHurwitz 我认为这对大多数情况都无关紧要,因为onCreate() 在服务中没有太多的事情发生
      • @AllDayAmazing 你想做什么?您可以使用类似于字段注入的方法注入,但由于框架创建服务,您不能使用构造函数注入。除此之外,您始终可以将配置方法添加到组件并手动获取依赖项,使用 Dagger 作为一种服务定位器
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-30
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-13
      相关资源
      最近更新 更多