问题 第二个操作的PendingIntent会覆盖第一个操作和contentIntent for Notification


代码:

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());

问题:

单击未展开或展开的通知正文或打开操作按钮始终使用(KEY_TURN_OFF_NOTIFICATION_ID)额外传递意图。

我试过放弃TaskStackBuilder并创建 PendingIntent简单地说:

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中永远不会收到额外的动作。


11449
2018-02-08 23:03


起源



答案:


来自 DOC

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

因此,你必须使这些意图不同 Intent.filterEquals 方法:

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

作为旁注,我在处理firefox for android的下载通知时遇到了同样的问题 这里


13
2018-02-09 10:00



为每个人添加动作来区分他们是不同的。谢谢你的指点。 - Saran
在我看来,这是一个设计缺陷,肯定不是Android开发人员所犯的“错误”。 - JacksOnF1re
我塞了一些随意的字符串 setType() 它工作得很好,谢谢 - EpicPandaForce
谢谢你的提示。虽然我通过设置SetType()来实现它 - Muhammad Farrukh Faizy
Set Type也适用于我,在传递给挂起意图的意图上使用它。 - JoshuaTree


答案:


来自 DOC

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

因此,你必须使这些意图不同 Intent.filterEquals 方法:

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

作为旁注,我在处理firefox for android的下载通知时遇到了同样的问题 这里


13
2018-02-09 10:00



为每个人添加动作来区分他们是不同的。谢谢你的指点。 - Saran
在我看来,这是一个设计缺陷,肯定不是Android开发人员所犯的“错误”。 - JacksOnF1re
我塞了一些随意的字符串 setType() 它工作得很好,谢谢 - EpicPandaForce
谢谢你的提示。虽然我通过设置SetType()来实现它 - Muhammad Farrukh Faizy
Set Type也适用于我,在传递给挂起意图的意图上使用它。 - JoshuaTree


于是 PendingIntent.FLAG_UPDATE_CURRENT 如果您正在创建只有附加项更改的新意图,则flag将覆盖附加内容。

尝试添加不同的

  • 行动就像 intent.setAction("DISTINCT.ACTION.HERE") 要么
  • 类别 intent.addCategory("DISTINCT.CATEGORY.HERE")

对于每个意图。

欢呼:-)


3
2017-12-14 08:11