2015-11-30 2 views
5

Нужно ли кому-то уже вводить уже существующий класс с некоторой бизнес-логикой в ​​BroadcastReceiver, используя кинжал?Как вводить в BroadcastReceiver

Я использую кинжал 1 и уже нашел хороший пример (https://github.com/adennie/fb-android-dagger), но я не смог найти, как мы можем добавить уже существующий класс, принадлежащий другому модулю, в BroadcastReceiver.

Любая помощь или совет были бы очень признательны.

ответ

1

мне удалось внедрить прецеденты в мой Broadcast путем определения модуля, которые обеспечивают случаи использования, мне нужно, и я добавить модуль на 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; 
} 
12

же, как вы впрыснуть к деятельности

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

Это может быть слишком поздно, чтобы ответить на этот вопрос, но я приведу пример из моего недавнего проекта, в котором я попытался придать 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.

Смежные вопросы