Описание намерения и целевого действия, которое необходимо выполнить с ним. Экземпляры этого класса создаются с помощью
getActivity(android.content.Context,int,android.content.Intent,int), getActivities(android.content.Context,int,android.content.Intent[],int), getBroadcast(android.content.Context,int, android.content.Intent,int), getService(android.content.Context,int,android.content.Intent,int);
возвращенный объект может быть передан другим приложениям, чтобы они могли выполнить описанное вами действие от вашего имени позднее.
Предоставляя PendingIntent другому приложению, вы предоставляете ему право выполнять указанную вами операцию, как если бы это другое приложение было вами (с теми же разрешениями и идентификатором). Таким образом, вы должны быть осторожны с тем, как вы создаете PendingIntent: почти всегда, например, базовое намерение, которое вы предоставляете, должно иметь имя компонента, явно установленное для одного из ваших собственных компонентов, чтобы гарантировать, что в конечном итоге он будет отправлен туда и никуда больше.
Сам PendingIntent — это просто ссылка на маркер, поддерживаемый системой, описывающий исходные данные, используемые для его извлечения. Это означает, что даже если процесс приложения-владельца будет уничтожен, сам PendingIntent останется доступным для использования другими процессами, которые ему передали. Если создающее приложение позже повторно извлечет PendingIntent того же типа (та же операция, то же действие Intent, данные, категории и компоненты и те же флаги), оно получит PendingIntent, представляющий тот же токен, если он все еще действителен, и может таким образом, вызовите cancel(), чтобы удалить его.
Из-за такого поведения важно знать, когда два Intent считаются одинаковыми для получения PendingIntent. Распространенной ошибкой людей является создание нескольких объектов PendingIntent с намерениями, которые различаются только своим дополнительным содержимым, ожидая каждый раз получать разные PendingIntent. Этого не происходит. Части намерения, которые используются для сопоставления, — это те же части, которые определены в Intent.filterEquals. Если вы используете два объекта Intent, которые эквивалентны Intent.filterEquals, вы получите один и тот же PendingIntent для обоих из них.
Есть два типичных способа справиться с этим.
Если вам действительно нужно несколько разных объектов PendingIntent, активных одновременно (например, для использования в качестве двух уведомлений, которые отображаются одновременно), вам нужно убедиться, что в них есть что-то другое, чтобы связать их с разными Ожидающие намерения. Это может быть любой из атрибутов Intent, рассматриваемых Intent.filterEquals, или различные целые числа кода запроса, предоставленные для getActivity(android.content.Context,int,android.content.Intent,int), getActivities(android.content.Context,int, android.content.Intent[],int), getBroadcast(android.content.Context,int,android.content.Intent,int) или getService(android.content.Context,int,android.content.Intent,int).
Если вам нужен только один PendingIntent, активный одновременно для любого из намерений, которые вы будете использовать, вы можете в качестве альтернативы использовать флаги FLAG_CANCEL_CURRENT или FLAG_UPDATE_CURRENT, чтобы либо отменить, либо изменить любой текущий PendingIntent, связанный с намерением, которое вы предоставляете.