protected void displayNotification(String response) {
Intent intent = new Intent(context, testActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK);
Notification notification = new Notification(R.drawable.icon, "Upload Started", System.currentTimeMillis());
notification.setLatestEventInfo(context, "Upload", response, pendingIntent);
nManager.notify((int)System.currentTimeMillis(), notification);
}
Diese Funktion wird mehrmals aufgerufen. Ich möchte, dass jeder notification
testActivity startet, wenn er angeklickt wird. Leider startet nur die erste Benachrichtigung testActivity. Wenn Sie auf den Rest klicken, wird das Benachrichtigungsfenster minimiert.
Zusätzliche Informationen: Die Funktion displayNotification()
befindet sich in einer Klasse namens UploadManager
. Context
wird UploadManager
von dem übergeben activity
, der instanziiert. Die Funktion displayNotification()
wird mehrmals von einer Funktion aufgerufen, auch in UploadManager, die in einem ausgeführt wird AsyncTask
.
Edit 1: Ich habe vergessen zu erwähnen, dass ich die String-Antwort Intent intent
als übergeben werde extra
.
protected void displayNotification(String response) {
Intent intent = new Intent(context, testActivity.class);
intent.putExtra("response", response);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
Dies macht einen großen Unterschied, da ich die zusätzliche "Antwort" benötige, um die String-Antwort bei der Erstellung der Benachrichtigung wiederzugeben. Stattdessen PendingIntent.FLAG_UPDATE_CURRENT
spiegelt die zusätzliche "Antwort" bei Verwendung die Zeichenfolgenantwort beim letzten Aufruf von wider displayNotification()
.
Ich weiß, warum das so ist, wenn ich die Dokumentation weiter lese FLAG_UPDATE_CURRENT
. Ich bin mir jedoch im Moment nicht sicher, wie ich das umgehen soll.
quelle
Kämpfte mit
RemoteViews
und mehrere verschiedeneIntents
für jedesButton
aufHomeScreen
Widget. Funktionierte beim Hinzufügen dieser:1.
intent.setAction(Long.toString(System.currentTimeMillis()));
2.
PendingIntent.FLAG_UPDATE_CURRENT
quelle
setAction
setAction
, können Sie Folgendes tunaddCategory
.PendingIntent
wird verwendetIntent.filterEquals
, um die Gleichheit von Aktion, Daten, Typ, Klasse und Kategorien zu überprüfen. developer.android.com/reference/android/content/…Aktion einstellen Hat das für mich gelöst. Hier ist mein Verständnis der Situation:
Ich habe mehrere Widgets, an die jeweils ein PendingIntent angehängt ist. Wann immer man aktualisiert wurde, wurden alle aktualisiert. Die Flags beschreiben, was mit genau gleichen PendingIntents passiert.
Die Beschreibung von FLAG_UPDATE_CURRENT liest sich jetzt viel besser:
Wenn derselbe PendingIntent, den Sie erstellen, bereits vorhanden ist, aktualisieren Sie alle alten auf den neuen PendingIntent, den Sie erstellen.
Die Definition von genau dem gleichen betrachtet das gesamte PendingIntent mit Ausnahme der Extras. Selbst wenn Sie für jede Absicht unterschiedliche Extras haben (für mich habe ich die appWidgetId hinzugefügt), sind sie für Android gleich.
Das Hinzufügen von .setAction mit einer eindeutigen Dummy-Zeichenfolge teilt dem Betriebssystem mit. Diese sind völlig anders und aktualisieren nichts. Am Ende ist hier meine Implementierung, die wie gewünscht funktioniert, wobei jedem Widget seine eigene Konfigurationsabsicht beigefügt ist:
AKTUALISIEREN
Noch bessere Lösung für den Fall, dass Sie mit Sendungen arbeiten. Eindeutige PendingIntents werden auch durch eindeutige Anforderungscodes definiert. Hier ist meine Lösung:
quelle
Ich sehe Antworten, aber keine Erklärungen. Außerdem spricht keine der Antworten alle möglichen Lösungen an, daher werde ich versuchen, dies klar zu machen.
Dokumentation:
Ursache des Problems:
Sie erstellen 2 Benachrichtigungen mit 2 ausstehenden Absichten. Jede ausstehende Absicht ist mit einer Absicht verbunden:
Diese beiden Absichten sind jedoch gleich. Wenn Ihre zweite Benachrichtigung eintrifft, wird die erste Absicht gestartet.
Lösung:
Sie müssen jede Absicht einzigartig machen, damit keine ausstehenden Absichten jemals gleich sind. Wie machen Sie die Absichten einzigartig? Nicht durch die Extras, die Sie mit setzen
putExtra()
. Selbst wenn die Extras unterschiedlich sind, können die Absichten immer noch gleich sein. Um jede Absicht eindeutig zu machen, müssen Sie einen eindeutigen Wert für die Absichtsaktion oder die Daten oder den Typ oder die Klasse oder die Kategorie oder den Anforderungscode festlegen: (einer dieser Codes funktioniert)intent.setAction(...)
intent.setData(...)
intent.setType(...)
intent.setClass(...)
intent.addCategory(...)
PendingIntent.getActivity(context, YOUR_UNIQUE_CODE, intent, Intent.FLAG_ONE_SHOT);
Hinweis : Das Festlegen eines eindeutigen Anforderungscodes kann schwierig sein, da Sie ein int benötigen, während
System.currentTimeMillis()
long zurückgegeben wird. Dies bedeutet, dass einige Ziffern entfernt werden. Daher würde ich empfehlen, entweder mit der Kategorie oder der Aktion zu gehen und eine eindeutige Zeichenfolge festzulegen.quelle
Ich hatte das gleiche Problem und konnte es beheben, indem ich das Flag auf änderte:
quelle
Verwenden Sie als Dokumentation den eindeutigen Anforderungscode:
quelle
Fwiw, ich hatte besseres Glück mit
PendingIntent.FLAG_CANCEL_CURRENT
als mitPendingIntent.FLAG_UPDATE_CURRENT
.quelle
Ich hatte das gleiche Problem und habe es durch die folgenden Schritte behoben
1) Löschen Sie alle Flaggen für Absichten
2) Fügen Sie intent.setAction mit dem folgenden Code ein
3) Geben Sie für Pendingintent den folgenden Code ein
Ich hoffe mit dir zu arbeiten
quelle
In PendingIntent gibt es zwei int-Parameter, den zweiten und den letzten. Der zweite ist "Anforderungscode" und muss eine eindeutige Nummer sein (zum Beispiel die ID Ihrer Benachrichtigung), andernfalls wenn (wie in Ihrem Beispiel ist es gleich Null, wird es immer überschrieben).
quelle
quelle
Um Daten besonders korrekt zu senden, sollten Sie die Benachrichtigungs-ID mit ausstehender Absicht wie folgt senden: PendingIntent pendingIntent = PendingIntent.getActivity (Kontext, (int) System.currentTimeMillis () , Absicht, PendingIntent.FLAG_UPDATE_CURRENT);
quelle
Ich habe das gleiche Problem und verwende PendingIntent.html.FLAG_UPDATE_CURRENT , um es zu beheben.
Ich habe den Quellcode überprüft. In ActivityManagerService.java lautet die Schlüsselmethode wie folgt. Wenn das Flag PendingIntent.FLAG_UPDATE_CURRENT lautet und updateCurrent true ist. Einige Extras werden durch neue ersetzt und wir erhalten einen ersetzten PendingIntent.
quelle
Ich hatte das gleiche Problem und konnte es beheben, indem ich das Flag auf änderte:
quelle