wake-up-neo.com

Die Benachrichtigung besteht aus alten Absichts-Extras

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. Innerhalb der Aktivität kann ich die foo_id vom Intent-Bundle abrufen (z. B. 1).

Wenn jedoch eine weitere Benachrichtigung ausgelöst wird und ich erneut darauf klicke, erhält die Aktivität 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.

114
BrianM

Sie senden den gleichen Anforderungscode für Ihren ausstehenden Intens ..

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);

Zu:

PendingIntent contentIntent = PendingIntent.getActivity(context, UNIQUE_INT_PER_CALL, notificationIntent, 0);

absichten werden nicht erstellt, wenn Sie dieselben Parameter senden. Sie werden wiederverwendet.

235
IncrediApp

Alternativ können Sie den folgenden Code verwenden, um Ihr PendingIntent zu generieren:

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

Aus dem Dokument für PendingIntent.FLAG_UPDATE_CURRENT:

Wenn das beschriebene PendingIntent bereits vorhanden ist, behalten Sie es bei, ersetzen Sie jedoch die zusätzlichen Daten durch das, was sich in diesem neuen Intent befindet. Dies kann verwendet werden, wenn Sie Absichten erstellen, bei denen sich nur die Extras ändern, und es sich nicht darum kümmert, dass Entitäten, die Ihren vorherigen PendingIntent erhalten haben, sie mit Ihren neuen Extras starten können, auch wenn sie nicht explizit angegeben werden.

124
ChristophK

Sie übergeben dieselbe ID. Erstellen Sie in dieser Situation aus der Zeit eine eindeutige ID:

int iUniqueId = (int) (System.currentTimeMillis() & 0xfffffff);

Und sage es so:

PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(),iUniqueId, intentForNotification, 0);
38
hderanga

Für jeden, der nach langer Zeit den besten Ansatz sucht, müssen Sie PendingIntent.FLAG_UPDATE_CURRENT als letztes Argument übergeben (siehe unten)

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

sie müssen nicht einmal eine neue eindeutige ID angeben.

3
Gentle

Ich wollte nur eine weitere Option hinzufügen

 PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_IMMUTABLE);
0
pellucide

Ihr Anforderungscode ist 0 für alle Benachrichtigungen. Ändern Sie folgende Zeile:

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);

Mit:

PendingIntent contentIntent = PendingIntent.getActivity(context, new Random().nextInt(), notificationIntent, 0);
0
Faisal Shaikh