97 Stimmen

PendingIntent funktioniert bei der ersten Meldung korrekt, bei den übrigen Meldungen jedoch nicht

  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 mehrere Male aufgerufen. Ich möchte für jede notification um testActivity zu starten, wenn sie angeklickt wird. Leider wird testActivity nur durch die erste Benachrichtigung gestartet. Wenn Sie auf die anderen klicken, wird das Benachrichtigungsfenster minimiert.

Zusätzliche Informationen: Funktion displayNotification() ist in einer Klasse namens UploadManager . Context wird übergeben an UploadManager von der activity die instanziiert. Funktion displayNotification() wird mehrfach von einer Funktion aufgerufen, die sich ebenfalls im UploadManager befindet und in einem AsyncTask .

Edit 1: Ich habe vergessen zu erwähnen, dass ich die String-Antwort in Intent intent als 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 wird mit PendingIntent.FLAG_UPDATE_CURRENT Der Zusatz "Antwort" gibt an, wie die String-Antwort beim letzten Aufruf von displayNotification() .

Ich weiß, warum das so ist, denn ich habe die Dokumentation zu FLAG_UPDATE_CURRENT . Ich bin mir jedoch nicht sicher, wie man das Problem im Moment umgehen kann.

9voto

Tomasz Punkte 1386

Wie in der Dokumentation beschrieben, verwenden Sie einen eindeutigen Anforderungscode:

Wenn Sie wirklich mehrere unterschiedliche PendingIntent-Objekte benötigen, die bei (z. B. als zwei Benachrichtigungen, die beide gleichzeitig angezeigt werden) gleichzeitig angezeigt werden), dann müssen Sie sicherstellen, dass es etwas gibt das sich von den anderen unterscheidet, um sie mit verschiedenen PendingIntents. Dies kann jedes der Intent-Attribute sein, die von Intent.filterEquals berücksichtigten Intent-Attribute sein, oder unterschiedliche Anforderungscode-Ganzzahlen, die an getActivity(Context, int, Intent, int), getActivities(Context, int, Intent[], int), getBroadcast(Context, int, Intent, int), oder getService(Context, int, Intent, int).

8voto

Jon Shemitz Punkte 1235

Übrigens hatte ich mehr Glück mit PendingIntent.FLAG_CANCEL_CURRENT als mit PendingIntent.FLAG_UPDATE_CURRENT .

6voto

Waleed A. Elgalil Punkte 355

Ich hatte das gleiche Problem und habe es mit den folgenden Schritten behoben

1) Alle Flaggen für Absicht löschen

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);

2) Fügen Sie intent.setAction mit dem folgenden Code ein

 intent.setAction(Long.toString(System.currentTimeMillis()));

3) für Pendingintent den folgenden Code einfügen

   PendingIntent Pintent = PendingIntent.getActivity(ctx,0, intent,PendingIntent.FLAG_UPDATE_CURRENT);

Ich hoffe auf eine Zusammenarbeit mit Ihnen

2voto

Dmytro Ubogyi Punkte 61
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK);

In PendingIntent gibt es zwei int-Parameter, den zweiten und den letzten. Der zweite ist der "request code" und muss eine eindeutige Nummer sein (z.B. die ID Ihrer Meldung), andernfalls wird er immer überschrieben, wenn er (wie in Ihrem Beispiel) gleich Null ist.

1voto

MIkka Marmik Punkte 1091
// Use pending Intent and  also use unique id for display notification....
// Get a PendingIntent containing the entire back stack
PendingIntent notificationPendingIntent = stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);
NotificationManager mNotificationManager = (NotificationManager)  sqlitewraper.context.getSystemService(Context.NOTIFICATION_SERVICE);
// Issue the notification
mNotificationManager.notify(id, builder.build());

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X