web-dev-qa-db-fra.com

Utilisation de Dagger 2 pour injecter en service

J'ai une application qui est fondamentalement un service qui fonctionne tout le temps et qui alerte l'utilisateur lorsque quelque chose se passe.

Lorsque le service crée l'alarme, il doit lui donner son context pour que l'alarme puisse faire rappels au service quand quelque chose se passe.

Par exemple:

public MyService extends Service{
    private SomeAlarm alarm;

    @Override
    public void onCreate() {
        super.onCreate();
        alarm = new SomeAlarm(MyService.this);
    }
}

Comment puis-je injecter la classe SomeAlarm dans le service et donner au SomeAlarm le contexte du service en tant que variable?

26
Ofek Agmon

J'ai écrit le code du haut de ma tête, donc il pourrait y avoir une faute de frappe ou deux.

Vous le faites de la même manière que lorsque vous injectez des choses dans des activités.

  1. Déclarez un composant,
  2. ajouter la méthode d'injection à ce composant,
  3. ajouter un module fournissant votre service
  4. créer ce constructeur de composants
  5. ajoutez votre module au constructeur
  6. injectez votre service avec le composant

Votre module et composant ressemblerait à ceci (peut-être ajouter une portée)

@Module
class ServiceModule {

    MyService mService;

    ServiceModule(MyService service) {
        mService = service;
    }

    @Provides
    MyService provideMyService() {
        return mService;
    }
}

@Component(modules=ServiceModule.class)
interface MyServiceComponent {
    void inject(MyService service);
}

Puis dans onCreate créez simplement votre composant et injectez votre alarme.

@Inject
private SomeAlarm alarm;

public void onCreate() {
    DaggerMyServiceComponent.builder()
            .serviceModule(new ServiceModule(this))
            .build()
            .inject(this);

    alarm.doStuff();
}

Cela suppose que votre alarme peut être injectée par le constructeur en ayant un @Inject constructeur annoté comme ceci:

class SomeAlarm {
    @Inject
    SomeAlarm(MyService service) {
        /*constructor stuff*/
    }
}

Sinon, vous ajouteriez simplement la création d'alarme à votre module.

37
David Medenjak