14

Ich habe eine App, die im Grunde ein Dienst ist, der die ganze Zeit läuft und den Benutzer alarmiert, wenn etwas passiert.Mit Dolch 2 in Dienst zu setzen

Wenn der Dienst den Alarm erstellt, muss er es context geben, damit der Alarm Rückrufe zum Dienst tun kann, wenn etwas passiert.

Zum Beispiel:

public MyService extends Service{ 
    private SomeAlarm alarm; 

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

Wie kann ich die SomeAlarm Klasse in den Dienst zu injizieren, und geben den SomeAlarm den Dienstkontext als Variable?

+3

warum die downvote sein? –

Antwort

17

Ich schrieb den Code von der Spitze meines Kopfes, so könnte es ein Tippfehler oder zwei sein.

Sie tun es genauso wie wenn Sie Dinge in Aktivitäten injizieren.

  1. eine Komponente Deklarieren,
  2. die inject Verfahren auf diese Komponente hinzuzufügen,
  3. fügen ein Modul Dienst
  4. erstellen, vorausgesetzt Komponenten Builder
  5. Ihr Modul
  6. inject zum Builder hinzufügen Ihr Service mit der Komponente

Ihr Modul und Compo nent würde Ihre Komponente in etwa so aussehen (vielleicht etwas Spielraum hinzufügen)

@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); 
} 

Dann in onCreate nur erstellen und Alarm injiziert.

@Inject 
private SomeAlarm alarm; 

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

    alarm.doStuff(); 
} 

Dies wird vorausgesetzt, dass Ihr Alarm kann Konstruktor, indem er eine @Inject kommentierte Konstruktor wie diese injiziert werden:

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

sonst würden Sie den Alarm Schöpfung Ihr Modul nur noch hinzufügen.

+2

danke für deine antwort. der Code wird nicht kompilieren, sagen „Builder() privater Zugang in Builder hat“, wenn ich den Alarm –

+0

zu injizieren versuche @OfekAgmon diesem Grund habe ich die erste Zeile in meiner Antwort gegeben. Es ist 'DaggerMyServiceComponent.builder()'. –

+0

Dank, auch ich brauchte die „neuen“ nehmen vor dem DaggerMyServiceComponent.builder() –

0

hatte ein ähnliches Problem, herausstellte, dass ich Builder wurde() aufgerufen wird (Versalien- B) Richtige sollte man Builder (Klein b)