Potrebbe essere troppo tardi per rispondere a questa domanda, ma mi fornirà un esempio dal mio recente progetto in cui ho cercato di iniettare AppWidgetProvider
che è una sottoclasse diretta di BroadcastReceiver
.
Abbiamo bisogno di iniettare un servizio di retrofit in un BroadcastReceiver
:
@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);
}
}
Creare un altro astratto @Module
per la con metodi astratti annotati con @ContributesAndroidInjector
che restituiscono BroadcastReceiver
s si vuole iniettare:
/**
* To inject the app widgets.
*/
@Module
public abstract class WidgetsModule {
@ContributesAndroidInjector
abstract IngredientsWidget contributesIngredientsWidget();
}
Se hai dimenticato di aggiungere questo modulo, riceverai un errore del tipo:
java.lang.IllegalArgumentException: No fabbrica iniettore diretto a Classe <>
Poi il componente con entrambi i moduli, oltre AndroidInjectionModule
@Singleton
@Component(modules = {AndroidInjectionModule.class, NetModule.class, WidgetsModule.class})
public interface AppComponent {
void inject(RecipesApp recipesApp);
}
Poi nella classe Application
di implementare HasBroadcastReceiverInjector
interfaccia.
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;
}
}
Infine, è possibile iniettare il BroadcastReceiver all'interno OnReceive() prima di chiamare super().
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);
}
}
È possibile trovare maggiori informazioni su come iniettare componenti Android docs.
Ho creato un piccolo campione: broadcast-injection.