2015-11-30 10 views
5

Hat jemand bereits eine bereits existierende Klasse, mit etwas Geschäftslogik, in einen BroadcastReceiver mit Dolch injizieren müssen?Wie man in einen BroadcastReceiver injiziert

Ich benutze Dolch 1 und habe bereits ein schönes Beispiel gefunden (https://github.com/adennie/fb-android-dagger), aber ich konnte nicht finden, wie wir eine bereits existierende Klasse, die zu einem anderen Modul gehört, in einen BroadcastReceiver aufnehmen können.

Jede Hilfe oder Beratung wäre sehr willkommen.

Antwort

1

ich es geschafft, Use Cases in meine Sendung durch ein Modul, das bieten die Anwendungsfälle ich brauche und ich fügen Sie das Modul auf dem OnReceive Methode, überprüfen Sie den Code zu injizieren:

Mein 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; 
    } 
} 

Mein 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; 
} 
12

Gleiche wie Sie zu einer Aktivität injizieren

public void onReceive(Context context, Intent intent) { 
     ((Application) context.getApplicationContext()).getInjector().inject(this); 
    } 
2

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.

Verwandte Themen