Это может быть слишком поздно, чтобы ответить на этот вопрос, но я приведу пример из моего недавнего проекта, в котором я попытался придать AppWidgetProvider
, который является прямым подклассом BroadcastReceiver
.
Нам необходимо внедрить услугу модифицированную в 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);
}
}
Создайте еще один абстрактный @Module
для с абстрактными методами снабженными @ContributesAndroidInjector
, которые возвращают BroadcastReceiver
s вы хотите, чтобы ввести:
/**
* To inject the app widgets.
*/
@Module
public abstract class WidgetsModule {
@ContributesAndroidInjector
abstract IngredientsWidget contributesIngredientsWidget();
}
Если вы забыли добавить этот модуль, вы получите сообщение об ошибке:
java.lang.IllegalArgumentException: Нет форсунка завод не связан для класса <>
Затем компоненты с обоих модулей, кроме AndroidInjectionModule
@Singleton
@Component(modules = {AndroidInjectionModule.class, NetModule.class, WidgetsModule.class})
public interface AppComponent {
void inject(RecipesApp recipesApp);
}
Затем в Application
классе вы реализуете HasBroadcastReceiverInjector
интерфейс.
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;
}
}
Наконец, вы можете придать свой BroadcastReceiver внутри OnReceive() перед вызовом супер().
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);
}
}
Вы можете узнать больше о том, как придать андроид компоненты docs.
Я построил небольшой образец: broadcast-injection.