63

几天前,我一直在努力寻找一种方法来为我的警报使用自定义意图。虽然我得到了明确的答案,但我必须根据一些唯一的 ID 来定制 Intent,例如。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);

这像这样工作:

  • 应用程序为联系人创建消息
  • 提供了一个意图,其中包含联系人 ID 和有关消息的详细信息
  • 与消息一起引发通知
  • 用户对通知的操作和应用程序显示意图传递的消息

问题

对于一个联系人,这种情况可能会发生不止一次。并且当生成第二条消息时,通知会很好地引发(那里的消息很好)但是当用户操作它使用旧数据的通知时的意图,所以之前的消息被传递而不是全新的消息。

所以不知何故,意图是缓存和重用以前的附加内容。如何使每个联系人和每个操作都独一无二?

4

2 回答 2

101

如果您PendingIntents的此联系人中只有一个在任何时间点未完成,或者如果您总是想使用最新的附加组件,FLAG_UPDATE_CURRENT请在创建PendingIntent.

如果不止一个特定联系人PendingIntent将同时突出,并且他们需要有单独的额外内容,您将需要添加计数或时间戳或其他东西来区分它们。

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

更新

Also, the lightly-documented second parameter to getActivity() and kin on PendingIntent apparently can be used to create distinct PendingIntent objects for the same underlying Intent, though I have never tried this.

于 2010-06-29T11:56:14.800 回答
38

I usually specify unique requestCode to prevent my PendingIntents from overriding each other:

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

And in your case I agree with CommonsWare you just need FLAG_UPDATE_CURRENT flag. New extras will override old values.

于 2010-06-29T12:16:23.493 回答