Es könnte zu spät sein, um diese Frage zu beantworten, aber ich werde ein Beispiel aus meinem aktuellen Projekt zur Verfügung stellen, wo ich versuchte AppWidgetProvider
zu injizieren, die eine direkte Unterklasse von BroadcastReceiver
ist.
Wir brauchen einen Nachrüst-Service in eine BroadcastReceiver
zu injizieren:
@Module
public class NetModule {
/** shrunk for simplicity's sake. **/
@Singleton
@Provides
public WidgetService provideWidgetService(Application application, OkHttpClient client, Gson gson) {
return new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create(gson))
.baseUrl(application.getString(R.string.api_url))
.client(client)
.build()
.create(WidgetService.class);
}
}
Erstellen Sie eine andere abstrakte @Module
für die mit abstrakten Methoden mit @ContributesAndroidInjector
kommentierte, dass die Rückkehr BroadcastReceiver
s Sie injizieren wollen:
/**
* To inject the app widgets.
*/
@Module
public abstract class WidgetsModule {
@ContributesAndroidInjector
abstract IngredientsWidget contributesIngredientsWidget();
}
Wenn Sie vergessen haben, dieses Modul hinzuzufügen, erhalten Sie einen Fehler wie:
java.lang.IllegalArgumentException: Nein Injektor Fabrik für Klasse <>
dann die Komponente mit beiden Modulen gebunden, neben AndroidInjectionModule
@Singleton
@Component(modules = {AndroidInjectionModule.class, NetModule.class, WidgetsModule.class})
public interface AppComponent {
void inject(RecipesApp recipesApp);
}
Dann in Ihrer Application
Klasse Sie HasBroadcastReceiverInjector
Schnittstelle implementieren.
public class RecipesApp extends Application implements HasBroadcastReceiverInjector {
@Inject
DispatchingAndroidInjector<BroadcastReceiver> broadcastReceiverInjector;
@Override
public void onCreate() {
super.onCreate();
component().inject(this);
}
public AppComponent component() {
return DaggerAppComponent.builder()
.build();
}
@Override
public AndroidInjector<BroadcastReceiver> broadcastReceiverInjector() {
return broadcastReceiverInjector;
}
}
Schließlich können Sie Ihren BroadcastReceiver in onReceive() injizieren, bevor Sie den Super() aufrufen.
public class IngredientsWidget extends AppWidgetProvider {
@Inject
public WidgetService api;
@Override
public void onReceive(Context context, Intent intent) {
/** Don't forget this line **/
AndroidInjection.inject(this, context);
super.onReceive(context, intent);
}
}
Sie können mehr über finden, wie docs android Komponenten zu injizieren.
Ich baute eine kleine Probe: broadcast-injection.