Intereting Posts
Запуск эспрессо после профайлинга приложения, но не проверка Как вернуть String или JSONObject из асинхронного обратного вызова с помощью Retrofit? Кнопки Android Radio в пользовательском listview меняют свое состояние при прокрутке списка Примеры файлов построения градиентов для ссылки на Crashlytics из проектов приложений и библиотек Gradle build застрял на mergeDebugResources на centos Можем ли мы подключиться к iPhone с устройства Android, хотя и не в той же сети? Эллипсирование только раздела в TextView Android: загрузка фотографии в Cloudinary с обратным вызовом прогресса в HttpURLConnection Обнаружение отключения от точки доступа WiFi Можно ли использовать Android Beam между устройством Android и другим устройством NFC? HTTP-запрос для файла XML Устанавливать подчеркивание текста в TextView в андроиде программно Удалить слушателя из вида в android Как получить следующий и предыдущий элементы списка из списка в android Как получить доступ к com.android.internal.R.bool в приложении?

Как андроид сравнивает ожидающие намерения

Документация для PendingIntent.FLAG_NO_CREATE :

Флаг, указывающий, что если описанный PendingIntent еще не существует, просто возвращайте null вместо его создания.

Мой вопрос: какие критерии используются для сравнения PendingIntents?

Я предполагаю, что под капотом этот флаг использует PendingIntent.equals , но я не совсем уверен, какие критерии использует функция. Используется ли действие action, requestCode, категории, дополнения (я догадываюсь нет) и т. Д.?

Контекст:

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

Intent i = new Intent(applicationContext, MyService.class); i.setAction("myAction"); PendingIntent pi = PendingIntent.getService(applicationContext, /*requestCode*/0, i, PendingIntent.FLAG_NO_CREATE); if (pi != null) { AlarmManager alarmMgr = (AlarmManager)applicationContext.getSystemService(Context.AlarmService); alarmMgr.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, AlarmManager.INTERVAL_HOUR, AlarmManager.INTERVAL_HOUR, pi); } 

Solutions Collecting From Web of "Как андроид сравнивает ожидающие намерения"

Чтобы определить, соответствует ли соответствие 2 PendingIntent s, должно быть указано следующее:

  • Параметр PendingIntent используемый при создании PendingIntent
  • ДЕЙСТВИЕ
  • КАТЕГОРИИ
  • Intent DATA
  • МИНИТЕТ
  • Intent пакет
  • Компонент Intent

Дополнения не принимаются во внимание.

Вы можете прочитать больше в сводной документации PendingIntent и Intent.filterEquals () .

Я предполагаю, что под капотом этот флаг использует PendingIntent.equals, но я не совсем уверен, какие критерии использует функция. Используется ли действие action, requestCode, категории, дополнения (я догадываюсь нет) и т. Д.?

На самом деле подсказка в описании класса:

Описание действия Intent и target для выполнения с ним. Экземпляры этого класса создаются с помощью

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: почти всегда, например, базовый Intent, который вы поставляете, должен иметь имя компонента, явно установленное на один из ваших собственных компонентов, чтобы гарантировать, что он в конечном итоге отправлен туда и нигде больше.

Сам PendingIntent – это просто ссылка на токен, поддерживаемый системой, описывающей исходные данные, используемые для ее извлечения. Это означает, что, даже если процесс его приложения приложения будет убит, сам PendingIntent останется пригодным для других процессов, которые ему были предоставлены. Если впоследствии созданное приложение повторно извлекает один и тот же вид PendingIntent (та же операция, то же действие, данные, категории и компоненты Intent, и те же флаги), он получит PendingIntent, представляющий тот же токен, если он все еще действителен, и может Поэтому отмените (), чтобы удалить его.

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

Есть два типичных способа справиться с этим.

Если вам действительно понадобятся несколько разных объектов PendingIntent одновременно (например, чтобы использовать как два уведомления, которые одновременно отображаются одновременно), тогда вам нужно будет убедиться, что есть что-то, что отличается от них, чтобы связать их с разными PendingIntents. Это может быть любой из атрибутов 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, связанного с заданным вами намерением.

От: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.0.0_r1/android/app/PendingIntent.java#PendingIntent