誰かが、既存のクラスをいくつかのビジネスロジックと共に、短剣を使用してBroadcastReceiverに挿入する必要がありますか?
私は短剣1を使用していて、すでに素敵な例( https://github.com/adennie/fb-Android-dagger )を見つけましたが、既存のクラスを追加する方法を見つけることができませんでした別のモジュールに属するをBroadcastReceiverに追加します。
任意の助けやアドバイスをいただければ幸いです。
必要なユースケースを提供するモジュールを定義してブロードキャストにユースケースを挿入し、onReceiveメソッドにモジュールを追加しました。以下のコードを確認してください。
私BroadcastReceiverModule:
@Module(injects = { MyBroadcastReceiver.class }, addsTo = MyAppModule.class)
public class BroadcastReceiverModule {
@Provides @Singleton MyUtilsClass providesMyUtilsClass(MyUtilsClassImpl myUtilsClass) {
return myUtilsClass;
}
@Provides @Singleton MyUseCase providesMyUseCase(MyUseCaseImpl myUseCaseUtils) {
return myUseCaseUtils;
}
}
私BroadCastReceiver:
@Inject MyUtilsClass myUtilsClass;
@Inject MyUseCase myUseCase;
@Override public void onReceive(Context context, Intent intent) {
AcidApplication.getScopedGraph(getModules().toArray()).inject(this);
myUseCase.call();
myUtilsClass.doSomething();
}
protected List<Object> getModules() {
List<Object> result = new ArrayList<>();
result.add(new BroadcastReceiverModule());
return result;
}
アクティビティに注入するのと同じ
public void onReceive(Context context, Intent intent) {
((Application) context.getApplicationContext()).getInjector().inject(this);
}
この質問に答えるには遅すぎるかもしれませんが、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);
}
}
挿入するBroadcastReceiver
sを返す@Module
で注釈が付けられた抽象メソッドを使用して、別の抽象@ContributesAndroidInjector
を作成します。
/**
* To inject the app widgets.
*/
@Module
public abstract class WidgetsModule {
@ContributesAndroidInjector
abstract IngredientsWidget contributesIngredientsWidget();
}
このモジュールを追加するのを忘れた場合、次のようなエラーが発生します。
Java.lang.IllegalArgumentException:Class <>にバインドされたインジェクターファクトリがありません
次に 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()を呼び出す前に、onReceive()内にBroadcastReceiverを挿入できます。
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 。
BroadcastReceiverにオブジェクトを挿入するためのDagger 2の例
BroadcastReceiverModule.kt
@Module
abstract class BroadcastReceiverModule {
@ContributesAndroidInjector
abstract fun contributesMyTestReceiver() : MyTestReceiver
}
AppComponent.kt
@Singleton
@Component(
modules = [
(AndroidSupportInjectionModule::class),
(BroadcastReceiverModule::class)
])
interface AppComponent : AndroidInjector<MyApp> {
@Component.Builder
abstract class Builder : AndroidInjector.Builder<MyApp>()
}
Applicationクラス
class MyApp : DaggerApplication() {
override fun applicationInjector(): AndroidInjector<MyApp> =
DaggerAppComponent.builder().create(this@MyApp)
}
BroadcastReceiverクラス
class MyTestReceiver : BroadcastReceiver() {
@Inject
lateinit var anInjectedObject: MyInjectObject
override fun onReceive(context: Context, intent: Intent) {
AndroidInjection.inject(this, context)
anInjectedObject.doSomthing()
}
}
DaggerBroadcastReceiverを使用するか、以下のようにonReceiveメソッドをオーバーライドできます。
public void onReceive(Context context, Intent intent) {
AndroidInjection.inject(this, context);
// your code should be here ...
}
ダガードキュメント: https://dagger.dev/api/2.24/dagger/Android/DaggerBroadcastReceiver