Какой "запросКод" используется для PendingIntent?

Фон:

Я использую PendingIntent для аварийных сигналов через AlarmManager.

Проблема:

Сначала я подумал, что для того, чтобы отменить предыдущие, я должен предоставить точный код запроса, который я использовал раньше, чтобы запустить будильник.

Но потом я обнаружил, что ошибся, поскольку API отмены говорит:

Удалите все аварийные сигналы с соответствующим намерением. Любая сигнализация любого типа, чье намерение соответствует этому (как определено filterEquals (Intent)), будут отменены.

глядя на filterEquals, в документации говорится:

Определите, являются ли два намерения одинаковыми для целей намерения разрешение (фильтрация). То есть, если их действие, данные, тип, класс, и категории одинаковы. Это не сравнивает лишние данные включены в намерения.

поэтому я не понимаю, что такое "requestCode" для...

Вопрос:

Что такое "requestCode" , используемый для?

Что делать, если я создаю несколько аварийных сигналов с тем же "requestCode" ? они переопределяют друг друга?

Ответ 1

  • requestCode используется для получения того же ожидающего экземпляра намерения позже (для отмены и т.д.).
  • Да, я думаю, что сигналы тревоги будут отменять друг друга. Я бы сохранил коды запросов уникальными.

Ответ 2

Я просто хочу добавить к ответу @Minhaj Arfin

1- requestCode используется для получения того же ожидающего намерения позже (для отмены и т.д.)

2 Да, они будут переопределяться, пока вы укажете того же получателя в своем намерении, который вы укажете на своем PendingIntent

Пример:

Intent startIntent1 = new Intent(context, AlarmReceiverFirst.class);
PendingIntent pendingIntent1 = PendingIntent.getBroadcast(context, 0, startIntent1, 0);

Intent startIntent2 = new Intent(context, AlarmReceiverSecond.class);
PendingIntent pendingIntent2 = PendingIntent.getBroadcast(context, 0, startIntent2, 0);

Из приведенного выше примера они не будут переопределять друг друга , потому что приемник отличается (AlarmReceiverFirst и AlarmReceiverSecond)

Intent startIntent2 = new Intent(context, AlarmReceiverSecond.class);
PendingIntent pendingIntent2 = PendingIntent.getBroadcast(context, 0, startIntent2, 0);

Intent startIntent3 = new Intent(context, AlarmReceiverSecond.class);
PendingIntent pendingIntent3 = PendingIntent.getBroadcast(context, 0, startIntent3, 0);

Из приведенного выше примера они будут переопределять друг друга, , потому что приемник одинаковый (AlarmReceiverSecond)

Ответ 3

в моем случае я хочу открыть одно и то же действие с двумя разными намерениями, поэтому, если в трее есть два или более FCMS, любой из них откроет только другой, не будет, поэтому я изменил коды запросов ожидающего намерения, чтобы это сработало.

 PendingIntent pendingIntent =
                            PendingIntent.getActivity(this, **Some unique id for all GCMS** /* Request code */, intent,
                                    PendingIntent.FLAG_ONE_SHOT);

Ответ 4

Одна важная вещь о requestCode, которая серьезно беспокоит ваше приложение - это использование виджетов. виджеты не будут работать после перезагрузки телефона, если их requestCode одинаков. это означает, что для pendingIndent вы устанавливаете для remoteViews вашего виджета, должен быть установлен уникальный requestCode, обычно это widgetId, сопровождающий число.