现在回答这个问题可能为时已晚,但我将提供我最近项目中的一个示例,我尝试注入 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);
}
}
为带有@ContributesAndroidInjector 注释的抽象方法创建另一个抽象@Module,这些方法返回您要注入的BroadcastReceivers:
/**
* To inject the app widgets.
*/
@Module
public abstract class WidgetsModule {
@ContributesAndroidInjector
abstract IngredientsWidget contributesIngredientsWidget();
}
如果你忘记添加这个模块,你会得到如下错误:
java.lang.IllegalArgumentException: No injector factory bound for
类
然后是两个模块的组件,除了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;
}
}
最后,您可以在调用 super() 之前将 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);
}
}
你可以找到更多关于如何注入android组件docs。
我构建了一个小样本:broadcast-injection。