簡體   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