2016-06-18 8 views
1

Ich weiß, es gibt eine Reihe von Fragen zu diesem Thema, aber nichts scheint für mich zu arbeiten.Broadcast Receiver in Service nicht erhalten Intent

Ich habe einen Dienst, der Broadcasts von mehreren Aktivitäten empfängt, und ich differenziere sie mit verschiedenen Aktionen für jede Sendung erhalten.

Hier ist mein Code

MyService.java // Das ist Serviceklasse

private BroadcastReceiver SleepTimeReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d(TAG,"SleepTimeReceiver onReceive is called"); 
     if (intent.getAction().equals("sleepTimeFinished")) { 
      Log.d(TAG,"intents are matching"); 
     } 
    } 
}; 

@Override 
public void onCreate() { 
    Log.d(TAG,"onCreate is called"); 
    . 
    . 
    registerReceiver(SleepTimeReceiver,new IntentFilter("sleepTimeFinished")); 
} 

@Override 
public void onDestroy() { 
    Log.d(TAG, "on destroy is called"); 
    unregisterReceiver(SleepTimeReceiver); 
} 

MyActivity.java // Das ist Aktivitätsklasse

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    Log.d(TAG,"About to send broadcast"); 
    Intent sleepTimeFinishedIntent = new Intent(this, MyService.class); 
    sleepTimeFinishedIntent.setAction("sleepTimeFinished"); 
    sendBroadcast(sleepTimeFinishedIntent); 
    Log.d(TAG,"broadcast has been sent"); 
} 

Ich habe versucht, auch hinzufügen der Empfänger in der Manifest-Datei, aber ohne Erfolg. Im Logcat kann ich die Protokolle aller Methoden sehen, mit Ausnahme der onReceive-Methode des Empfängers. Kann mir jemand dabei helfen? Dieses einfache Problem nervt mich seit Stunden.

+0

wofür benötigen Sie 'BroadcastReceiver'? Warum benutzt du 'startService' nicht, um mit deinem' Service' zu ​​"reden"? – pskink

+0

Ich benutze den Dienst tatsächlich, um Musik zu spielen. Mit dieser Aktivität kann der Dienst wissen, wann die Wiedergabe der Musik basierend auf der Benutzerauswahl beendet werden soll. – Nikhil

+0

so brauchen Sie es überhaupt nicht: entweder 'bindService' von Ihrer Aktivität (empfohlen) oder sprechen Sie mit Ihrem Service über' startService' Anrufe (nicht empfohlen) – pskink

Antwort

0

Haben Sie den Service gestartet? Ich sehe nicht in onCreate starten, und dort senden Sie Broadcast - vielleicht Empfänger ist noch nicht registriert?

+0

Ja Ich habe bereits mit einer anderen Aktivität begonnen. Das ist kein Problem. – Nikhil

+0

Ihre Sendung wird nicht beabsichtigt, weil Sie MyService als Komponente dafür in 'new Intent (this, MyService.class);' angeben. Versuche es mit einem leeren Konstruktor und Intent geht zu deinem Empfänger. –

+0

Ich habe versucht, die Methode, die Sie vorgeschlagen, aber es immer noch nicht die Absicht erhalten. – Nikhil

0

Es scheint mir, dass Sie die LocalBroadcastManager verwenden sollten, da Sie nur Sendungen behandeln, die von Ihrer eigenen Anwendung gesendet werden.

Also innerhalb onCreate() von MyService.java Ihre BroadcastReceiver wie folgt registrieren:

LocalBroadcastManager.getInstance(this).registerReceiver(sleepTimeReceiver, new IntentFilter("sleepTimeFinished")); 

Dann von onCreate() von MyActivity.java Ihre Sendung wie folgt senden:

Intent sleepTimeFinishedIntent = new Intent("sleepTimeFinished"); 
LocalBroadcastManager.getInstance(this).sendBroadcast(sleepTimeFinishedIntent); 

In onDestroy() von MyService.java deregistrieren Ihre lokalen Broadcast Empfänger wie folgt:

LocalBroadcastManager.getInstance(this).unregisterReceiver(sleepTimeReceiver); 

Wie Sie vielleicht bemerkt haben, habe ich auch den Namen Ihres Rundfunkempfängers geändert, um mit einem Kleinbuchstaben zu beginnen, einfach aus Gründen der Konsistenz. So ist es sleepTimeReceiver und nicht SleepTimeReceiver.