我使用GCM和通知构建简单的应用程序,我已经成功实现了,但我对通知有疑问,在我的情况下:
我收到了多个通知, 实施例
Notif_1 - >标题:test_1,消息:test_message_1
Notif_2 - >标题:test_2,消息:test_message_2
Notif_3 - >标题:test_3,消息:test_message_3
Notif_4 - >标题:test_4,消息:test_message_4
问题我点击通知时总是收到最后一个通知包。
因此,当我点按notif_1
时,我从notif_4
当我点按notif_2
时,我从notif_4
我想要的是当我点按notif_1
时,必须拥有来自notif_1
的捆绑而不是来自其他商品
如何做到这一点?
private void sendNotification(String title, String msg) {
mNotificationManager =
(NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE);
Intent resultIntent = new Intent(ctx, BuyLevel.class);
Bundle bundle = new Bundle();
bundle.putString("title", title);
bundle.putString("message", msg);
resultIntent.putExtras(bundle);
resultIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(ctx);
stackBuilder.addParentStack(BuyLevel.class);
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent =
stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(ctx);
mBuilder.setSmallIcon(R.drawable.icon_mini);
mBuilder.setContentTitle(title);
mBuilder.setStyle(new NotificationCompat.BigTextStyle().bigText(msg));
mBuilder.setContentText(msg);
mBuilder.setContentIntent(resultPendingIntent);
mBuilder.setAutoCancel(true);
Notification notification = mBuilder.build();
notification.defaults |= Notification.DEFAULT_SOUND;
notification.defaults |= Notification.DEFAULT_VIBRATE;
int initialNotification = CommonUtilities.msgId.incrementAndGet();
mNotificationManager.notify(initialNotification, notification);
}
答案 0 :(得分:0)
必须使用唯一值来标记。所以我们可以将标志设置为随机数。 改变这一行:
PendingIntent resultPendingIntent =
stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
到
Random random = new Random();
int m = random.nextInt(9999 - 1000) + 1000;
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, m);
答案 1 :(得分:0)
根据PendingIntent的文件:
如果创建应用程序稍后重新检索相同类型的 PendingIntent(相同的操作,相同的Intent操作,数据,类别, 和组件,以及相同的标志),它将收到一个PendingIntent 表示相同的标记,如果它仍然有效。
[...]
人们常犯的错误是创建多个PendingIntent 具有Intent的对象只有在" extra"内容, 期望每次获得不同的PendingIntent。事实并非如此 发生。用于匹配的Intent部分是 由Intent.filterEquals定义的相同内容。 如果您使用两个Intent 根据Intent.filterEquals等效的对象,那么你会 获得相同的PendingIntent。
如果您确实需要多个不同的PendingIntent对象,请执行此操作 同时(,例如用作两个显示的通知 同时),那么你需要确保有一些东西 将他们与不同的人联系起来是不同的 PendingIntents。
[...]
这可能是所考虑的任何Intent属性 提供的Intent.filterEquals或 不同的请求代码整数 getActivity(Context,int,Intent,int),getActivities(Context,int, Intent [],int),getBroadcast(Context,int,Intent,int)或 getService(Context,int,Intent,int)。
因此,在请求PendingIntent时,您的代码应该是:
int m=0;
private void sendNotification(String title, String msg) {
mNotificationManager = (NotificationManager) ctx
.getSystemService(Context.NOTIFICATION_SERVICE);
[...]
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(m++,
PendingIntent.FLAG_UPDATE_CURRENT);
[...]
}