我遇到的问题是,无论用户触摸什么通知,我都会收到相同的通知,即使它被取消了。
用户触摸的第一个通知是唯一一个将被发送到我的待定意图的通知,直到设备重启(然后第一个触摸的通知成为新的加利福尼亚州酒店通知)。
以下是我构建通知的方式:
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));
无论我触摸哪个通知,在日志Touched notification ID: 1234
中始终会显示,即使我触摸的通知的ID为56789
。
我非常怀疑这是我的测试设备的问题,但是它有帮助;我使用带有KitKat 4.4.4的2013 Nexus 7和Dalvik运行时(不是ART)Build KTU84P。
答案 0 :(得分:2)
将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的角度来看,两个意图是一样的。
有趣的是,reqCode
(PendingIntent.getActivity(...)
)中的第二个参数进行了比较。这应该会使Intents
成为唯一。