将依赖项注入 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>

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

我知道这个问题很老了,但在过去的几个小时里我一直在思考这个问题,并找到了解决方案。

使用新的 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。这奏效了。