Задний план:
Я использую PendingIntent для сигналов тревоги через AlarmManager.
Эта проблема:
Сначала я подумал, что для того, чтобы отменить предыдущие, я должен предоставить точный requestCode, который я использовал раньше, чтобы запустить будильник.
Но потом я обнаружил, что ошибался, поскольку API отмены говорит:
Удалите все тревоги с соответствующим намерением. Любой сигнал тревоги любого типа, намерение которого соответствует этому (как определено filterEquals (Intent)), будет отменено.
глядя на filterEquals , в документации говорится:
Определите, совпадают ли два намерения для целей разрешения намерений (фильтрации). То есть, если их действие, данные, тип, класс и категории совпадают. При этом не сравниваются никакие дополнительные данные, включенные в намерения.
поэтому я не понимаю, для чего нужен "requestCode" ...
Вопрос:
Для чего используется requestCode?
Что, если я создам несколько алармов с одним и тем же «requestCode»? они перекрывают друг друга?
источник
If you truly need multiple distinct PendingIntent objects active at the same time (such as to use as two notifications that are both shown at the same time), then you will need to ensure there is something that is different about them to associate them with different PendingIntents. This may be any of the Intent attributes considered by Intent#filterEquals(Intent), or different request code integers supplied.
Ответы:
requestCode
используется для получения того же ожидающего экземпляра намерения позже (для отмены и т. д.).источник
Я просто хочу добавить к ответу @Minhaj Arfin
1- requestCode используется для получения того же ожидающего намерения позже (для отмены и т. Д.)
2- Да, они будут переопределены, если вы укажете того же получателя для своего намерения, которое вы указываете в своем PendingIntent.
пример:
В приведенном выше примере они не будут перекрывать друг друга, потому что получатель отличается (AlarmReceiverFirst и AlarmReceiverSecond)
В приведенном выше примере они будут перекрывать друг друга, потому что получатель один и тот же (AlarmReceiverSecond)
источник
AlarmReceiverSecond.class
по назначению, а затем используйтеPendingIntent.getService()
. Это не сработает, такAlarmReceiverSecond.class
как этоBroadcastReceiver
, а неService
в моем случае я хочу открыть одно и то же действие с двумя разными намерениями, поэтому, если в лотке есть два или более FCMS, любой из них будет только открывать, другой - нет, поэтому я изменил коды запросов ожидающих намерений, тогда это сработало.
источник
Одна важная вещь,
requestCode
которая может серьезно повредить вашему приложению, - это использование виджетов. виджеты не будут работать после перезагрузки телефона, если ониrequestCode
совпадают. это означаетpendingIndent
, чтоremoteViews
для вашего виджета должен быть установлен уникальный requestCode, обычно это widgetId, сопровождающий число.источник
Собственно, в документации четко указано, для чего используется код запроса:
Поскольку кажется, что все еще не так ясно, позвольте мне попытаться объяснить:
Когда вы хотите использовать
PendingIntent
объект, вы не просто создаете его экземпляр. Скорее, вы получаете его из системы, используяPendingIntent
статические методы (getActivity
,getBroadcast
иgetService
т. Д.). Система хранит несколько экземпляров PendingIntent и предоставляет вам один. Какой из них он вам дает, зависит от входных параметров, которые вы передаете этим методам получения. Этими входными параметрами являются:,Context
т.е. целевой получатель намерения,Intent
используемыйrequestCode
иflags
. Когда вы передаете то же самоеContext
, то жеrequestCode
самое намерение (то есть намерениеfilterEquals
с другим намерением), вы получаете тот жеPendingIntent
объект. Дело в том, что система хочет иметь как можно меньшеPendingIntent
объектов, поэтому она стремится повторно использовать существующие в максимально возможной степени.Например, у вас есть два календарных уведомления для двух разных дат. Когда вы нажимаете на один из них, вы хотите, чтобы ваше приложение открывалось до соответствующей даты этого уведомления. В этом сценарии у вас одна
Context
и та же цель, аIntent
объект, который вы передаете, отличается только EXTRA_DATA (который указывает дату, которая должна быть открыта). Если вы предоставите то же самоеrequestCode
при полученииPendingIntent
объекта, вы получите тот жеPendingIntent
объект. Итак, при создании второго уведомления вы замените старыйIntent
объект новым EXTRA_DATA и получите два уведомления, указывающих на одну и ту же дату.Если вы хотите иметь два разных
PendingIntent
объекта, как и должно быть в этом сценарии, вы должны указать другойrequestCode
при полученииPendingIntent
объекта.источник