144

我正在通过以下代码在 BroadcastReceiver 内创建通知:

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);

当我点击通知时,它会打开 NotificationActivity 并在 Activity 内我可以从 Intent-Bundle 中检索 foo_id(例如 1)

但是,如果触发了另一个通知并且我再次单击它,则活动仍会从 Intent-Bundle 接收“旧”值 (1)。我尝试使用 clear() 清除捆绑包,但效果相同。我认为我的代码有问题..

4

6 回答 6

283

您正在为待处理的 Intens 发送相同的请求代码。改变这个:

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

至:

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

如果您发送相同的参数,则不会创建意图。它们被重复使用。

于 2011-09-10T08:06:29.847 回答
144

或者,您可以使用以下代码生成 PendingIntent:

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

来自文档PendingIntent.FLAG_UPDATE_CURRENT

如果描述的 PendingIntent 已经存在,则保留它,但用这个新 Intent 中的内容替换其额外数据。如果您正在创建仅附加内容发生变化的意图,则可以使用此选项,并且不关心任何收到您之前的 PendingIntent 的实体将能够使用您的新附加内容启动它,即使它们没有明确提供。

于 2012-02-17T14:38:39.143 回答
43

您传递的是相同的 ID。在这种情况下,像这样从 time 中创建一个唯一的 id:

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

并把它这样说:

PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(),iUniqueId, intentForNotification, 0);
于 2012-08-17T06:29:06.463 回答
9

对于长时间寻找最佳方法的任何人,您需要将PendingIntent.FLAG_UPDATE_CURRENT作为最后一个参数传递,如下所示

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

您甚至不需要提供新的唯一 ID。

您需要为下一次而不是第一次执行此操作

于 2017-03-11T12:29:04.593 回答
0

只是想添加另一个选项

 PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_IMMUTABLE);
于 2019-08-29T23:18:28.523 回答
0

对于所有通知,您的请求代码均为 0。更改以下行:

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

和:

PendingIntent contentIntent = PendingIntent.getActivity(context, new Random().nextInt(), notificationIntent, 0);
于 2018-02-04T09:03:14.757 回答