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

проблема:

нажатие на нерасширенное или развернутое тело уведомления или на кнопку Открыть действие всегда передает намерение с (KEY_TURN_OFF_NOTIFICATION_ID) дополнительно.

Я попытался избавиться от TaskStackBuilder и создать PendingIntents просто:

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(), естественно, нажав на орган уведомления ничего не делает.

Если Я set setContentIntent() после настройка действий, то дополнительное никогда не получено в MainActivity.

2 ответов


С doc:

из-за этого поведения важно знать, когда два намерения считаются одинаковыми для целей извлечения PendingIntent. Распространенная ошибка людей заключается в создании нескольких объектов PendingIntent с намерениями, которые варьируются только в их "дополнительном" содержимом, ожидая получить другой PendingIntent каждый раз. Этого не происходит. Части намерения, которые используются для сопоставления, являются теми же, которые определены Намерение.filterEquals. Если вы используете два объекта Intent, которые эквивалентны в соответствии с Intent.filterEquals, то вы получите тот же PendingIntent для обоих из них.

таким образом, вы должны сделать эти намерения разными, как в Intent.filterEquals способ:

то есть, если их действие, данные, тип, класс и категории одинаковы. При этом не сравниваются никакие дополнительные данные, включенные в намерения.

в качестве примечания, у меня была та же проблема во время работы уведомления о загрузке firefox для android здесь


отсюда PendingIntent.FLAG_UPDATE_CURRENT флаг будет просто перезаписать экстры, если вы создаете новое намерение, где меняются только экстры.

попробуйте добавить distinct

  • как intent.setAction("DISTINCT.ACTION.HERE") или