我遇到一个问题,无论用户触摸了什么通知,即使取消了通知,我也总是收到相同的通知。

用户触摸的第一个通知是唯一会一直传递到我待定意图的通知,直到设备重新启动为止(然后第一个触摸的通知将成为新的Hotel California通知)。


这是我构造通知的方式:

    final Bundle extras = new Bundle();
    final int notificationId = Integer.parseInt(payload.getObjectId());

    extras.putInt(NOTIFICATION_ID, notificationId);

    final Intent intent = new Intent(context,
            PushNotificationLauncherActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    intent.putExtras(extras);

    final NotificationCompat.Builder builder = new NotificationCompat.Builder(
            context);
    builder.setContentTitle(context.getString(R.string.app_name));
    builder.setContentText(payload.getText());
    builder.setSmallIcon(R.drawable.icon_launcher);
    builder.setAutoCancel(true);

    final PendingIntent pIntent = PendingIntent.getActivity(context, 0,
            intent, 0, extras);

    builder.setContentIntent(pIntent);

    final Notification notification;
    if (Build.VERSION.SDK_INT < 16) {
        notification = builder.getNotification();
    } else {
        notification = builder.build();
    }

    notification.flags |= Notification.FLAG_AUTO_CANCEL;

    notificationManager.notify(notificationId, notification);


然后我的PushNotificationLauncherActivity中有这个:

    final Bundle extras = getIntent().getExtras();

    final int notificationId = extras
            .getInt(SocialcastGoogleCloudMessageReceiver.NOTIFICATION_ID);

    final NotificationManager notificationManager = (NotificationManager) this
            .getSystemService(NOTIFICATION_SERVICE);
    // please go away
    notificationManager.cancel(notificationId);

    Log.d(PushNotificationLauncherActivity.class.getSimpleName(),
            "Touched notification ID: " + String.valueOf(notificationId));


无论我触摸哪个通知,即使我触摸的通知的ID为Touched notification ID: 1234,也会始终显示日志56789

我高度怀疑这是我的测试设备存在的问题,但万一有帮助的话;我正在使用带有KitKat 4.4.4的2013 Nexus 7和Dalvik运行时(不是ART)Build KTU84P。

最佳答案

在此处将notificationId作为request code传递:

final PendingIntent pIntent = PendingIntent.getActivity(context, 0,
        intent, 0, extras);


更改为:

final PendingIntent pIntent = PendingIntent.getActivity(context, notificationId,
        intent, 0, extras);


比较两个Intent实例时,不比较包含的Bundles。因此,从android的角度来看,这两个意图是相同的。

有趣的是,比较了reqCodePendingIntent.getActivity(...)中的第二个参数)。这应该使您的Intents唯一。

07-24 09:47
查看更多