Android продолжает кешировать мои намерения Дополнения, как объявить ожидающее намерение, которое сохраняет свежие дополнения? - PullRequest
59 голосов
/ 29 июня 2010

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

Я определяю 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);

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

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

Проблема

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

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

Ответы [ 2 ]

94 голосов
/ 29 июня 2010

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

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

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

ОБНОВЛЕНИЕ

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

33 голосов
/ 29 июня 2010

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

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

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

...