2010-06-29 4 views
57

Несколько дней назад я изо всех сил пытался найти способ использовать индивидуальные намерения для своих сигналов тревоги. Хотя я получил ясный ответ, что мне нужно настроить намерения на основе некоторого уникального идентификатора, например. setAction() все еще есть некоторые проблемы.Android сохраняет кеширование моих намерений. Дополнительно, как объявить ожидающее намерение, которое содержит свежие дополнения?

Я определяю PendingIntent так:

Intent intent = new Intent(this, viewContactQuick.class); 
intent.setAction("newmessage"+objContact.getId());//unique per contact 
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
intent.putExtra("id", Long.parseLong(objContact.getId())); 
intent.putExtra("results", result.toArray()); 

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, intent, 0); 

то это используется менеджер уведомлений

NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(ns); 
// first try to clear any active notification with this contact ID 
mNotificationManager.cancel(Integer.parseInt(objContact.getId())); 

// then raise a new notification for this contact ID 
mNotificationManager.notify(Integer.parseInt(objContact.getId()), notification); 

Это работает так:

  • приложение создает сообщение для контакт
  • намерение предоставляется с контой кт идентификатор и сведения о сообщении
  • уведомление поднятого с сообщением
  • actiones пользователя на уведомление и приложение отображает сообщение, принятый умысел

Проблема

Это может случаются не раз для контакта. И когда генерируется второе сообщение, уведомление повышается хорошо (сообщение там хорошо), но намерение, когда пользователь выполняет уведомление, использует старые данные, поэтому передается предыдущее сообщение, а не новое сообщение.

Итак, в какой-то момент целью является кэширование и повторное использование предыдущих дополнений. Как я могу сделать его уникальным для каждого контакта и для каждого действия?

+0

Есть ли способ очистить все кэшированные IntentExtras? Я предполагаю, что я исправил его сейчас, но старые кэшированные намерения по-прежнему остаются ... – OneWorld

+0

Аналогичная проблема может возникнуть в зависимости от флагов Intent или режима запуска ActivityMode.В этом случае вам нужно будет проверить [Activity :: onNewIntent] (http://j.mp/ieXMCA), потому что Activity :: getIntent вернет ORIGINAL намерение Activity, а не новое намерение с обновленными действиями/дополнениями /и т.д. – brack

ответ

89

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

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

intent.setAction("actionstring" + System.currentTimeMillis()); 

UPDATE

Кроме того, слегка документированы второй параметр getActivity() и близких по PendingIntent по-видимому, могут быть использованы для создания различных PendingIntent объектов для одной и той же базовой Intent, хотя я никогда попробовал это.

+1

В итоге я добавил отметку времени для действия. – Pentium10

+7

мужчина, у вас есть все ответы –

+1

awesome! Я использовал свой текущий идентификатор виджета, чтобы разделить их (также позволяя некоторый уровень кэширования). – DavidG

29

Я обычно определяю уникальный requestCode, чтобы предотвратить мое PendingIntents переопределения друг друга:

PendingIntent pending = PendingIntent.getService(context, unique_id, intent, 0); 

И в вашем случае я согласен с CommonsWare вам просто нужно FLAG_UPDATE_CURRENT флага. Новые дополнения изменят старые значения.

+4

Это реальное решение – ognian

+1

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

+0

, и для создания unique_id это хорошее решение 'int unique_id = (int) System.currentTimeMillis();' –