Android通知问题多个时

时间:2014-05-06 08:50:55

标签: android notifications

我使用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);
}

2 个答案:

答案 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);
           [...]
}