Подтвердить что ты не робот

Почему 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);

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

     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);

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

Ответ 4

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

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

Ответ 5

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

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