16

Ich versuche, eine Benachrichtigungsaktion in meiner App hinzuzufügen, die ein Musik-Player ist. Wenn ein Stream gestartet wird, sollte eine Benachrichtigung ausgelöst werden und eine Stopp-Schaltfläche für den Stream sollte in der Benachrichtigung angezeigt werden. Die Benachrichtigung funktioniert soweit, ich habe Probleme mit der Stop-Aktion. Hier ist, wie es in den Dienst des Streams begonnen deklariert wird.Android-Benachrichtigungsaktion wird nicht ausgelöst (PendingIntent)

Intent stopIntent = new Intent(this, MusicPlayerNew.class); 
stopIntent.putExtra("STOP", "STOP"); 
PendingIntent stopPendingIntent = PendingIntent.getActivity(this, 0, 
       stopIntent, PendingIntent.FLAG_UPDATE_CURRENT, null); 
mBuilder.addAction(R.drawable.ic_stat_stop, "Stop", stopPendingIntent); 

Jetzt im onResume() - Methode meiner Tätigkeit prüfe ich mit getIntent() getStringExtra() für die „STOP“ extra, aber die Absicht ich über getIntent() abgerufen hat keine Extras gesetzt :(

ich habe versucht, auch eine Sendung schicken zu überprüfen (i einen Rundfunkempfänger arbeiten müssen vom Dienst an der Aktivität zu kommunizieren)

Intent stopIntent2 = new Intent(MusicPlayerNew.STOP_MEDIAPLAYER); 
PendingIntent stopPendingIntent2 = PendingIntent.getBroadcast(this, 0, 
       stopIntent2, PendingIntent.FLAG_UPDATE_CURRENT); 
mBuilder.addAction(R.drawable.ic_stat_stop, "Stop", stopPendingIntent2); 

Jetzt Dies funktioniert, wenn die Aktivität gerade im Vordergrund ist n der Hintergrund die Stopp-Taste tut nichts :(

EDIT: ich die BroadcastReceiver in meiner Tätigkeit als Privat Klasse

private class DataUpdateReceiver extends BroadcastReceiver { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
.. 
}} 

Im onResume() registrieren meine app für diesen Empfänger haben:

intentFilter = new IntentFilter(STOP_MEDIAPLAYER); 
registerReceiver(dataUpdateReceiver, intentFilter); 

onPause()

unregisterReceiver(dataUpdateReceiver); 

Nun, wenn ich die Aufhebung der Registrierung von der onPause() - Methode entferne, wird die Übertragung empfangen, selbst wenn die App/Aktivität nicht mehr im Vordergrund ist. Aber ist das der richtige Weg? Ich habe dieses Register/Unregister-Zeug von einem Tutorial im Web ich denke ..

+0

Ich habe das gleiche Problem auf KitKat. Ich habe zwei Aktionen, zuerst als gut, zweitens überhaupt nicht genannt. Haben Sie einen Weg gefunden, dieses Problem zu lösen? – Nik

+0

Ok, ich habe eine Lösung gefunden. Schau meine Antwort unten. – Nik

Antwort

9

Ich finde Lösung in diesem Thread auf Google Code https://code.google.com/p/android/issues/detail?id=61850

es beheben Sie PendingIntent.FLAG_CANCEL_CURRENT Flagge zu Ihrem PendingIntent hinzufügen.

PendingIntent stopPendingIntent2 = PendingIntent.getBroadcast(this, 0, 
      stopIntent2, PendingIntent.FLAG_CANCEL_CURRENT); 
+0

Danke. Das hat mich wirklich verrückt gemacht, als ich ein ähnliches Problem hatte. Das hat den Trick gemacht. Eventuell hätte auch ein Neustart des Gerätes geholfen, aber das ist sauber. – sivag1

0

Sie empfangen die Übertragung nicht, wenn es im Hintergrund ist, weil Sie in onPause aufheben. Verschieben Sie den UnregisterReceiver-Code in die OnDestroy-Funktion. Dies wird nur aufgerufen, wenn die Aktivität zerstört wird. Oder Sie können die Registrierung aufheben, sobald das erwartete Ereignis eingetreten ist.

2

Mehr als Rundfunkempfänger verwenden, sollten Sie einen Dienst verwenden und eine neue Aktion in Ihren Dienst auf diese Weise erklären:

public final String ACTION_STOP = "yourpackagename.ACTION_STOP"; 

Und dann erstellen Sie Ihre Absichten wie folgt aus:

Intent stopIntent = new Intent(this, YourService.class).setAction(YourService.ACTION_STOP); 
PendingIntent stopPendingIntent = PendingIntent.getService(this, 0, stopIntent, 0); 

Natürlich , stoppe die Wiedergabe in der Dienstfunktion , wenn die Aktion der Absicht gleich ACTION_STOP ist.

Dies sollte den Trick tun;)

0

Es gibt hier mehrere Fragen:

Teil 1: Warum ist Ihre Absicht, die "STOP" extra nicht erhalten? Obwohl es in dem von Ihnen bereitgestellten Code nicht zu sehen ist, wollte ich bestätigen, dass Sie das Flag FLAG_ACTIVITY_SINGLE_TOP für die Benachrichtigungsabsicht verwenden? Wenn dies der Fall ist, ist die Absicht, die Sie in Ihrer Aktivität erhalten, die Absicht, die die Aktivität gestartet hat, und daher ist das Extra "STOP" nicht verfügbar. Sie müssen die onNewIntent() in diesem Fall (wo die neue Absicht gesendet wird) erweitern. More info here.
Wenn Sie FLAG_ACTIVITY_SINGLE_TOP nicht verwendet haben, bedeutet dies, dass beim Antippen einer Benachrichtigung eine neue Aktivität erstellt wird. In diesem Fall muss der Intent den Parameter "STOP" haben. Wenn Sie mir allen relevanten Code zur Verfügung stellen können, kann ich Ihnen besser helfen.

Teil 2: Verwenden des Broadcast-Empfängers Dies ist nicht einfach, wie Sie bereits festgestellt haben. Sie müssten die Registrierung in onDestroy aufheben und wenn Ihre Aktivität vom Benutzer geschlossen wird, kann onDestroy aufgerufen werden und Ihr Broadcast-Empfänger ist möglicherweise nicht aktiv, wenn der Benutzer auf die Benachrichtigung klickt. Wenn Sie die Registrierung überhaupt nicht aufheben, scheint es zu funktionieren, aber dies ist ein Speicherverlust, GC kann jederzeit aufräumen, was zu einem Absturz in Ihrem Programm führen könnte, dh Sie müssen die Registrierung aufheben. Wenn Sie mit Broadcast-Empfänger-Ansatz gehen müssen, müssen Sie einen Dienst haben, um dies zu tun und Service kommt mit seinen eigenen Fallstricke -> Neustart durch System-, Batterie-Drain usw. Ich würde dringend empfehlen, gehen Sie mit Ihrem ersten Ansatz.

5

Ich lief in dieses Problem heute und es wurde durch die Aktivität verursacht nicht zu AndroidManifest.xml registriert oder hinzugefügt werden. Ich dachte, ich hätte es drin, aber es war nicht. Außerdem wurden keine Fehler protokolliert, indem versucht wurde, die Aktion mit ihrer Absicht aufzurufen.

Ich habe das herausgefunden, indem ich eine Absicht erstellt habe und startActivity (intent) aufgerufen habe, ohne eine Benachrichtigung zu verwenden. Es gab mir dann einen Fehler, der besagt, dass die Aktivität wahrscheinlich aus dem Manifest fehlte.

Wenn keine der anderen Antworten Ihr Problem lösen, dann wird dies hoffentlich. Gewöhnlich knifflige Probleme sind das Ergebnis von etwas einfach und dumm.

6

Ich stieß heute auf dieses Problem. In meinem Fall verwendete es Cache-Intention-Extras von einer vorherigen Instanz der Absicht, da alle Parameter für die pendingIntent Konstruktoren gleich waren. Ich fand zwei Lösungen für diese ...

  1. Mit FLAG_CANCEL_CURRENT wie Nik erwähnt.
  2. eine einzigartige requestCode zum pendingIntent Passing als

    folgt
    PendingIntent pi = PendingIntent.getService(this, UNIQUE_ID, pi, 0); 
    

In meinem Fall löste das zweite Verfahren das Problem, als ich die vorherigen Mitteilungen am Leben zu halten brauchen. Vielleicht hilft das jemandem mit ähnlichen Problemen.

+0

Ich glaube nicht, dass UNIQUE_ID benötigt wird, es sei denn, es gibt einen Konflikt mit einem anderen Dienst. –

0

Ich hatte ein sehr ähnliches Problem, aber eine ganz andere Lösung. Ausstehende Absicht wird auch nicht ausgelöst, wenn Sie <service android:enabled="false"></service> in Ihrer Datei manifest.xml deklariert haben.

Ersetzen android:enabled="false"-android:enabled="true"

nicht Dies könnte eine direkte Ausgabe des Problems sein. Wenn Sie jedoch den Dienst in Android Studio mithilfe der Standardvorlage erstellen, werden diese Eigenschaften automatisch zum Dienst hinzugefügt.

0

Für mich war die Lösung, die die Flaggen der Absicht zu setzen:

resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | 
       Intent.FLAG_ACTIVITY_CLEAR_TASK); 
6

Das ist sehr spät Antwort, aber es helfen, jemand kann:

Sie die richtige Art von Schwebende Absicht wählen sollten auf der Grundlage auf die Absicht, die Sie ausführen möchten. Hier sind einige Beispiele:

Für Aktivität Verwendung unter:

Intent i = new Intent(this, YourActivity.class); 
PendingIntent pi = PendingIntent.getActivity(this, 0, i, 0); 

Für Dienst Verwendung unter:

Intent i = new Intent(this, YourService.class); 
PendingIntent pi = PendingIntent.getService(this, 0, i, 0); 

Für Broadcast-Receiver Verwendung unter:

Intent i = new Intent(this, YourReciver.class); 
PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0); 

Möglicherweise müssen Sie den Anfragecode und die Flags bei Bedarf ändern