Почему PendingIntent не отправляет мою настраиваемую настройку Extras для Intent?

Эти вопросы каким-то образом связаны с вопросом, когда я искал, чтобы получить дополнительные услуги в startActivityForResult, но теперь я сталкиваюсь с другой проблемой.

Я подписался на получение ProximityAlerts, и я явно сконструировал Intent для включения некоторых дополнительных функций. Но когда я получил услугу, дополнительных услуг там нет.

После ответов здесь приведен рабочий код:

Intent intent = new Intent(this, PlacesProximityHandlerService.class); intent.setAction("PlacesProximityHandlerService"); intent.putExtra("lat", objPlace.getLat()); intent.putExtra("lon", objPlace.getLon()); intent.putExtra("error_m", objPlace.getError()+ALERT_RANGE_IN_METERS); PendingIntent sender=PendingIntent.getService(this, 0, intent, 0); LocationUtils.addProximity(this, objPlace.getLat(), objPlace.getLon(),objPlace.getError()+ALERT_RANGE_IN_METERS, -1, sender); 

В документации указано, что параметр PendingIntent to be sent for each location update

По какой-то неопределенной причине дополнительные функции будут доставлены только в том случае, если вы установили какое-то действие, например setAction («foo»). То, что CommonsWare ссылается, применяется только при получении экземпляров PendingIntent, если вы не установили FLAG_ONE_SHOT. Это может быть исправлено аргументом requestCode в методах PendingIntent.get … factory. Хотя документация говорит, что в настоящее время она не используется, она фактически учитывается при разграничении PendingIntents.

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

Если у вас много выдающихся PendingIntents , вам нужно убедиться, что базовые Intents отличаются друг от друга больше, чем их дополнительные функции. В противном случае Android будет продолжать использовать первый PendingIntent вы создали для своего первого Intent , используя все эти дополнительные возможности Intent все время.

Например, вы можете добавить уникальное действие через setAction() – это не изменит вашу маршрутизацию Intent (поскольку вы указываете компонент), но это сделает ваши Intents разными.

У меня была эта проблема, и решение, которое я нашел, было довольно простым, хотя я не могу объяснить, почему это сработало.

Первоначально мое ожидающее намерение выглядело так:

  notificationIntent = new Intent(ctx, FragmentTabsPager.class); notificationIntent.setData(Uri.parse("content://com.sbs.mobile.workorder.WorkOrder/notes/")); notificationIntent.putExtra("NOTIFICATION", true); notificationIntent.putExtra(WorkOrder.WorkOrderColumns.WORKORDERID, submessage); 

Когда вы создаете такое намерение, никакие дополнительные функции не будут переданы при нажатии на уведомление, карта экстрасов будет пуста в принимающей активности. Я сделал следующее изменение в строке, инициализирующей уведомление:

  notificationIntent = new Intent().setClass(ctx, FragmentTabsPager.class); 

Теперь дополнительные функции заполняются в процессе приема. Опять же, я не могу объяснить, почему это работает, но это устранило мою проблему.

Ключ состоит в том, чтобы установить дополнительные функции и уникальное действие в намерение перед вызовом

 PendingIntent sender=PendingIntent.getService(this, 0, intent, 0); 

Если вы установите дополнительные функции и действия в намерение после вызова вышеуказанного, это не сработает. Это не сработает:

 Intent intent; PendingIntent sender=PendingIntent.getService(this, 0, intent=new Intent(this, PlacesProximityHandlerService.class), 0); intent.setAction("PlacesProximityHandlerService"); intent.putExtra("lat", objPlace.getLat()); 

Ни один из ответов не работал для меня. Работа с определенной строкой выполняется впервые, но если вы используете одно и то же уведомление с другими дополнениями позднее, это не сработает. Я заменил строку метода setAction произвольно сгенерированной и работает без каких-либо проблем:

 intent.setAction(new Random().nextInt(50) + "_action"); 
  • Если вы считаете, что можете использовать уведомление много (например, для загрузки разных файлов), то передайте большее число nextInt()