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

Android продолжает кэшировать мои намерения. Дополнительно, как объявить ожидающее намерение, которое содержит свежие дополнения?

Несколько дней назад я изо всех сил пытался найти способ использовать собственные намерения для своих сигналов тревоги. Хотя я получил ясный ответ, что мне нужно настроить намерения на основе некоторого уникального идентификатора, например. 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);

Это работает следующим образом:

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

Проблема

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

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

4b9b3361

Ответ 1

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

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

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

UPDATE

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

Ответ 2

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

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

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