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

时间:2016-11-14 09:08:42

标签: java android dagger-2

我有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吗?这是注入依赖项的正确监听器吗?

1 个答案:

答案 0 :(得分:6)

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

使用新的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。这很有效。