Почему 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
Ответы
Ответ 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()