Android продолжает кешировать мои намерения Дополнения, как объявить ожидающее намерение, которое сохраняет свежие дополнения?
Несколько дней назад я изо всех сил пытался найти способ использовать собственные намерения для моих сигналов тревоги. Хотя я получил четкий ответ, что я должен настроить 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);
Это работает так:
- приложение создает сообщение для контакта
- намерение предоставляется с идентификатором контакта и детали о сообщении
- Уведомление поднимается с сообщением
- действие пользователя в уведомлении, и приложение отображает сообщение, переданное намерением
Эта проблема
Это может случиться более одного раза для контакта. И когда генерируется второе сообщение, уведомление генерируется хорошо (сообщение в порядке), но намерение, когда пользователь выполняет уведомление, использует старые данные, поэтому передается предыдущее сообщение, а не новое сообщение.
Так или иначе, целью является кэширование и повторное использование предыдущих дополнений. Как я могу сделать его уникальным для каждого контакта и для каждого действия?
3 ответа
Если только один из ваших PendingIntents
для этого контакта будет выдающийся в любой момент времени, или если вы всегда хотите использовать последний набор дополнений, используйте FLAG_UPDATE_CURRENT
когда вы создаете PendingIntent
,
Если более одного контактного PendingIntent
будет выдающимся сразу, и они должны иметь отдельные дополнения, вам нужно будет добавить счет или метку времени или что-то, чтобы отличить их.
intent.setAction("actionstring" + System.currentTimeMillis());
ОБНОВИТЬ
Кроме того, слегка документированный второй параметр getActivity()
и родня на PendingIntent
по-видимому, может быть использован для создания различных PendingIntent
объекты для того же базового Intent
Хотя я никогда не пробовал это.
Я обычно указываю уникальный requestCode, чтобы мои PendingIntents не перекрывали друг друга:
PendingIntent pending = PendingIntent.getService(context, unique_id, intent, 0);
И в вашем случае я согласен с CommonsWare, вам просто нужен флаг FLAG_UPDATE_CURRENT. Новые дополнения переопределяют старые значения.
Нашел простое решение, хитрость в коде запроса.
int requestCode = (int) System.currentTimeMillis();
PendingIntent contentIntent = PendingIntent.getActivity(context, requestCode, intent, PendingIntent.FLAG_IMMUTABLE);
Если вы будете использовать один и тот же код запроса для каждого PendingIntent, Android будет рассматривать его как один и тот же запрос, который вернет те же дополнительные функции, которые вы указали в своем первом запросе.