第二个操作的PendingIntent将覆盖第一个操作和contentIntent以进行通知

代码:

int id = 0; NotificationCompat.Builder builder = new NotificationCompat.Builder(context) .setContentTitle(context.getString(R.string.notification_on_the_move_gps_title)) .setContentText(context.getString(R.string.notification_on_the_move_text)); builder.setStyle(new NotificationCompat.BigTextStyle().bigText(context.getString(R.string.notification_on_the_move_gps_big_text))); Intent mainIntent = new Intent(context, MainActivity.class); Intent turnOffIntent = new Intent(context, MainActivity.class); turnOffIntent.putExtra(MainApp.KEY_TURN_OFF_NOTIFICATION_ID, id); TaskStackBuilder mainBuilder = TaskStackBuilder.create(context); mainBuilder.addParentStack(MainActivity.class); mainBuilder.addNextIntent(mainIntent); PendingIntent mainPendingIntent = mainBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); builder.setContentIntent(mainPendingIntent); TaskStackBuilder turnOffBuilder = TaskStackBuilder.create(context); turnOffBuilder.addParentStack(MainActivity.class); turnOffBuilder.addNextIntent(turnOffIntent); PendingIntent turnOffPendingIntent = turnOffBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); builder .setSmallIcon(R.drawable.ic_stat_notification) .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher)) .setAutoCancel(true) .setLights(Color.BLUE, 500, 500) .setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE) .addAction(R.drawable.ic_stat_notification, "Open", mainPendingIntent) .addAction(R.drawable.ic_stat_notification_off, "Turn off", turnOffPendingIntent); NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); nm.notify(id, builder.build()); 

问题:

单击未展开或展开的通知主体或打开操作button时,总是使用额外的(KEY_TURN_OFF_NOTIFICATION_ID)传输意图。

我已经尝试抛弃TaskStackBuilder并简单地创buildPendingIntent

 Intent mainIntent = new Intent(context, MainActivity.class); PendingIntent piMain = PendingIntent.getActivity(context, 0, mainIntent, 0); Intent turnOffIntent = new Intent(context, MainActivity.class); turnOffIntent.putExtra(MainApp.KEY_TURN_OFF_NOTIFICATION_ID, id); PendingIntent piTurnOff = PendingIntent.getActivity(context, 0, turnOffIntent, 0); 

但是,相同的效果:(

如果我省略setContentIntent() ,当然,在通知体上点击不会做任何事情。

如果设置操作之后设置了setContentIntent() ,那么在MainActivity中永远不会收到额外的内容。

Solutions Collecting From Web of "第二个操作的PendingIntent将覆盖第一个操作和contentIntent以进行通知"

从文档 :

由于这种行为,为了检索PendingIntent,知道何时两个Intents被认为是相同的是很重要的。 人们犯的一个常见错误是创build多个PenttentIntent对象,其Intents只在其“额外”内容上有所不同,期望每次都得到不同的PendingIntent。 这不会发生。 用于匹配的Intent部分与Intent.filterEquals定义的部分相同。 如果您使用两个与Intent.filterEquals等效的Intent对象,那么您将为它们获得相同的PendingIntent。

所以你必须使Intent.filterEquals方法的意图不同:

也就是说,如果他们的行为,数据,types,类别和类别是相同的。 这并不比较意图中包含的任何额外数据。

作为一个方面的说明,我有同样的问题,同时在这里为Android下载firefox的通知

因此, PendingIntent.FLAG_UPDATE_CURRENT标志只会覆盖额外的,如果你正在创造新的意图,只有额外的变化。

尝试添加不同的

  • intent.setAction("DISTINCT.ACTION.HERE")
  • 类似intent.addCategory("DISTINCT.CATEGORY.HERE")

为每个意图。

欢呼声:-)