Наконец-то получил решение по этой ссылке: https://github.com/googlesamples/android-architecture-components/issues/253
Поскольку MyFirebaseMessagingService
является классом Service
, поэтому для внедрения в класс Service
Dagger предоставляет способ, с помощью которого мы можем внедрять зависимостив класс обслуживания.Ниже приведены шаги для включения внедрения в классе обслуживания:
1) Make Application реализует HasServiceInjector и внедряет DispatchingAndroidInjector для сервисов.
public class App extends Application implements HasActivityInjector, HasServiceInjector {
@Inject
DispatchingAndroidInjector<Activity> dispatchingActivityInjector;
// Add this line
@Inject
DispatchingAndroidInjector<Service> dispatchingServiceInjector;
@Override
public void onCreate() {
super.onCreate();
AppInjector.init(this);
}
@Override
public AndroidInjector<Activity> activityInjector() {
return dispatchingActivityInjector;
}
// override this method after implementing HasServiceInjector
@Override
public AndroidInjector<Service> serviceInjector() {
return dispatchingServiceInjector;
}
}
2)Создайте новый модуль для внедрения в ваши службы.
@Module
abstract class ServiceBuilderModule {
// for my case, the service class which needs injection is MyFirebaseMessagingService
@ContributesAndroidInjector
abstract MyFirebaseMessagingService contributeMyFirebaseMessagingService();
}
3) Зарегистрируйте новый модуль в компоненте вашего приложения.
@Component(modules = {
AndroidSupportInjectionModule.class,
AppModule.class,
ActivityBuilderModule.class,
// Need to define previously created module class here
ServiceBuilderModule.class
})
@Singleton
public interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(App application);
AppComponent build();
}
void inject(App app);
}
4) И наконец, метод переопределения onCreate службы, добавляющий AndroidInjection.inject (this).
public class MyFirebaseMessagingService extends FirebaseMessagingService {
//So now we are able to inject here same as we do in Activity. No need for constructor injection
@Inject ExampleOneDao exampleOneDao
// Override this method first
@Override
public void onCreate() {
AndroidInjection.inject(this);
super.onCreate();
}
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
// use your dao here to store remoteMessage data payload into your database, e.g exampleOneDao.save(somethingHere)
}
}