Почему PendingIntent не отправляет обратно мои пользовательские настройки Extras для Intent? - PullRequest
34 голосов
/ 27 июня 2010

Этот вопрос как-то относится к вопросу, когда я искал получить дополнительные данные в 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

Ответы [ 5 ]

42 голосов
/ 27 июня 2010

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

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

22 голосов
/ 27 июня 2010

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

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

7 голосов
/ 12 июня 2013

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

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

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

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

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

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

2 голосов
/ 28 января 2017

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

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

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

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