2010-06-27 6 views
32

Эти вопросы как-то связаны с вопросом, когда я искал get the extras back in startActivityForResult, но теперь я сталкиваюсь с другим вызовом.Почему PendingIntent не отправляет обратно мою настраиваемую настройку Extras для намерения?

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

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

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

ответ

40

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

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

+0

Я пробовал это, и он diddnt работал. я сначала установил действие по моему намерению, а затем дополнительные функции и после того, как я создал ожидающее намерение, которое срабатывает от приемника трансляции, который срабатывает с помощью диспетчера аварийных сигналов. – jonney

21

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

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

+0

Мне удалось заставить его работать с setAction. В моем случае я создал уникальную строку для каждого вызова setAction. – drogon

+0

Как насчет PendingIntent.FLAG_ONE_SHOT? Я думал, что это решило проблему. – Sotti

+0

@Sotti: 'FLAG_ONE_SHOT' говорит, что' PendingIntent' может быть выполнен только один раз. Теперь, в идеале, это также означало бы, что попытка создать новый «PendingIntent» в эквивалентном «Intent» вернет отдельный «PendingIntent» ... и может быть. Однако это не документированное поведение, и поэтому я не решаюсь рекомендовать «FLAG_ONE_SHOT». Теперь, принятый ответ по этому вопросу говорит, что он работает, и это было поддержано честным, так что, возможно, это безопасно. Лично, учитывая послужной список Google, я склонен быть немного консервативным в таких крайних случаях. – CommonsWare

1

Ключа для установки дополнения и уникальных действий в намерении перед призывающих

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()); 
+0

. Проверьте свой код. – Richard

7

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

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

 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:

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

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

+1

Я пробовал это из отчаяния, и на удивление это сработало ... глядя на код, похоже, нет причин, по которым делать это так будет иначе. вздох. – handler

2

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

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