繁体   English   中英

在Dagger2中将依赖项注入后台服务

[英]Injecting dependencies into background service in Dagger2

我有Shared Preferences作为匕首单身组件。 我需要将它注入后台服务,如FirebaseInstanceService 这是我的尝试:

public class InstanceIDListenerService extends FirebaseInstanceIdService {
    @Inject
    Preferences preferences;

    @Override
    public void onTokenRefresh() {
        ((MyApp) getApplication()).getSingletonComponent().inject(this);
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
        preferences.setFcmToken(refreshedToken);

    }
}

它以这种方式使用:

   <service android:name="com.fcm.InstanceIDListenerService">
            <intent-filter>
                <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
            </intent-filter>
   </service>

我应该使用((MyApp) getApplication()).getSingletonComponent().inject(this); onTokenRefresh监听器? 这是注入依赖项的正确侦听器吗?

我知道这个问题已经过时了,但我在过去的几个小时里一直在努力,并找到了解决方案。

使用新的Dagger2版本,您现在可以让您的应用程序实现HasServiceInjector接口,该接口允许您将内容注入服务。

一个简单的例子:

1)创建您的服务模块:

@Module
abstract class ServicesModule {

  @ContributesAndroidInjector
  abstract SomeService ProvideSomeService();
}

2)将其添加到您的App组件:

@Component(modules = {
  AndroidSupportInjectionModule.class,
  AppModule.class,
  ActivitiesModule.class,
  ServicesModule.class
})
public interface AppComponent {

  @Component.Builder
  interface Builder {
    @BindsInstance
    Builder application(App application);

    AppComponent build();
  }

  void inject(App app);
}

3)让您的应用程序实现所述接口:

public class App extends Application implements HasActivityInjector, HasServiceInjector {

  @Inject
  DispatchingAndroidInjector<Activity> activityInjector;
  @Inject
  DispatchingAndroidInjector<Service> serviceInjector;

  @Override
  public void onCreate() {
    super.onCreate();
    AppInjector.init(this);
  }

  @Override
  public AndroidInjector<Activity> activityInjector() {
    return activityInjector;
  }

  @Override
  public AndroidInjector<Service> serviceInjector() {
    return serviceInjector;
  }
}

4)最后,注入您的服务:

public class SomeService extends Service {

  @Inject
  SomeDependency dependency;

  @Override
  public void onCreate() {
    AndroidInjection.inject(this);
    super.onCreate();
  }

  // Do things with your dependencies

}

我在示例中使用了一个服务,但我的实际用例也是使用FirebaseInstanceIdService。 这很有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM