PendingIntent сам по себе является просто ссылкой на токен, поддерживаемый системой, описывающий исходные данные, использованные для его получения. Это означает, что даже если процесс приложения-владельца будет убит, сам PendingIntent останется доступным для использования другими процессами, которым он был предоставлен. Если позднее создающее приложение повторно извлекает тот же тип PendingIntent (та же операция, такое же действие Intent, данные, категории и компоненты, а также те же флаги), оно получит PendingIntent, представляющий тот же токен, если он все еще действителен, и может поэтому вызовите cancel (), чтобы удалить его.
Из-за такого поведения важно знать, когда два намерения считаются одинаковыми для целей получения PendingIntent. Распространенной ошибкой, которую допускают люди, является создание нескольких объектов PendingIntent с намерениями, которые различаются только своим «дополнительным» содержимым, ожидая каждый раз получать другой PendingIntent. Этого не бывает. Для сопоставления используются те же части намерения, которые определены в Intent # filterEquals (Intent). Если вы используете два объекта Intent, которые эквивалентны согласно Intent # filterEquals (Intent), тогда вы получите одно и то же PendingIntent для них обоих.
Есть два типичных способа справиться с этим.
Если вам действительно нужно несколько разных объектов PendingIntent, активных одновременно (например, для использования в качестве двух одновременно отображаемых уведомлений), то вам нужно будет убедиться, что в них есть что-то отличное, чтобы связать их с разными PendingIntents. Это может быть любой из атрибутов Intent, учитываемых Intent # filterEquals (Intent), или разные код запроса целые числа, предоставленные getActivity (Context, int, Intent, int), getActivities (Context, int, Intent [] , int), getBroadcast (Context, int, Intent, int) или getService (Context, int, Intent, int).