Ich erstelle eine Benachrichtigung in einem BroadcastReceiver über diesen Code:
String ns = Context.NOTIFICATION_SERVICE;
NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(ns);
int icon = R.drawable.ic_stat_notification;
CharSequence tickerText = "New Notification";
long when = System.currentTimeMillis();
Notification notification = new Notification(icon, tickerText, when);
notification.defaults |= Notification.DEFAULT_VIBRATE;
long[] vibrate = {0,100,200,200,200,200};
notification.vibrate = vibrate;
notification.flags |= Notification.FLAG_AUTO_CANCEL;
CharSequence contentTitle = "Title";
CharSequence contentText = "Text";
Intent notificationIntent = new Intent(context, NotificationActivity.class);
notificationIntent.putExtra(Global.INTENT_EXTRA_FOO_ID, foo_id);
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
int mynotification_id = 1;
mNotificationManager.notify(mynotification_id, notification);
Wenn ich auf die Benachrichtigung klicke, wird die Benachrichtigungsaktivität geöffnet und innerhalb der Aktivität kann ich die foo_id aus dem Intent-Bundle abrufen (z. B. 1).
Wenn jedoch eine weitere Benachrichtigung ausgelöst wird und ich erneut darauf klicke, erhält die Aktivität immer noch den "alten" Wert (1) vom Intent-Bundle. Ich habe versucht, das Bundle mit clear () zu löschen, erhalte aber den gleichen Effekt. Ich denke, dass etw mit meinem Code falsch ist.
Antworten:
Sie senden denselben Anforderungscode für Ihre ausstehende Intensität. Ändere das:
Zu:
Absichten werden nicht erstellt, wenn Sie dieselben Parameter senden. Sie werden wiederverwendet.
quelle
Intent
dass ein , der verschiedene Extras (viaputExtra
) hat, als gleich angesehen und wiederverwendet werden, weil ich keine eindeutige ID für einen ausstehenden Absichtsanruf angegeben habe - schreckliche APIAlternativ können Sie den folgenden Code verwenden, um Ihren PendingIntent zu generieren:
Aus dem Dokument für
PendingIntent.FLAG_UPDATE_CURRENT
:quelle
Sie übergeben dieselbe ID. Erstellen Sie in einer solchen Situation aus dieser Zeit eine eindeutige ID:
Und sagen Sie es so:
quelle
System.currentTimeMillis()
gibt eine lange zurück, während derrequestId
Parameter vonPendingIntent.getActivity()
ein int nimmt.0xffffffff
ist eine Bitmaske. Es steckt zwar noch ein bisschen mehr dahinter, aber die einfache Erklärung ist, dass "long & 0xffffffff" die niedrigsten 32-Bit-Werte aus den Long-Werten ergibt und die höchsten 32-Bit-Werte verwirft, sodass Sie im Wesentlichen einen 32-Bit-Int erhalten. Dies ist besser als das einfache Umwandeln in ein Int, da es das Vorzeichenbit nicht durcheinander bringt (wenn Sie ein Long, das größer als ein Int ist, in ein Int umwandeln, läuft das Vorzeichenbit über und Sie erhalten möglicherweise einen negativen Wert )Für alle, die nach langer Zeit nach dem besten Ansatz suchen, müssen Sie PendingIntent.FLAG_UPDATE_CURRENT als letztes Argument übergeben, wie unten gezeigt
Sie müssen nicht einmal eine neue eindeutige ID angeben.
Sie müssen dies für das nächste Mal nicht zum ersten Mal tun
quelle
Ihr Anforderungscode ist 0 für alle Benachrichtigungen. Ändern Sie die folgende Zeile:
Mit:
quelle
Ich wollte nur eine weitere Option hinzufügen
quelle