Android 安卓一直在缓存我的额外意图,如何声明保留新额外意图的未决意图?

Android 安卓一直在缓存我的额外意图,如何声明保留新额外意图的未决意图?,android,android-intent,extras,Android,Android Intent,Extras,几天前,我正在努力寻找一种方法来为我的闹钟使用自定义意图。虽然我得到了明确的答案,我必须根据一些唯一的ID来定制意图,例如setAction()仍然存在一些问题 我这样定义PendingEvent: Intent intent = new Intent(this, viewContactQuick.class); intent.setAction("newmessage"+objContact.getId());//unique per contact intent.addFlags(Inten

几天前,我正在努力寻找一种方法来为我的闹钟使用自定义意图。虽然我得到了明确的答案,我必须根据一些唯一的ID来定制意图,例如
setAction()
仍然存在一些问题

我这样定义PendingEvent:

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和有关消息的详细信息
  • 通知随消息一起引发
  • 用户在通知上执行操作,应用程序显示用户传递的消息
问题

对于一个联系人,这种情况可能会发生多次。当生成第二条消息时,会很好地发出通知(这里的消息很好),但用户操作通知时的意图是使用旧数据,因此传递的是前一条消息,而不是全新的消息


因此,在某种程度上,目的是缓存和重用以前的额外功能。如何使每个联系人和每个操作都具有唯一性?

如果此联系人的
挂起内容在任何时间点都只有一个是未完成的,或者如果您总是想使用最新的一组附加内容,请在创建
挂起内容时使用
标记更新\u当前

如果一次有多个特定于联系人的
pendingent
未完成,并且它们需要单独的附加项,则您需要添加一个计数或时间戳或其他东西来区分它们

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

更新


另外,可以使用
getActivity()
pendingent
上的kin轻松记录的第二个参数为相同的基础
意图创建不同的
pendingent
对象,尽管我从未尝试过这种方法。

我通常指定唯一的请求代码,以防止挂起的内容相互覆盖:

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

在您的情况下,我同意Commonware,您只需要使用FLAG\u UPDATE\u CURRENT FLAG。新的附加值将覆盖旧的值。

我最终为操作添加了一个时间戳。太棒了!我使用我当前的小部件id将它们分开(还允许某种程度的缓存)。我有一个关于
setAction()
的快速问题。它到底做什么?我看了看医生,但还是有点困惑。回答得很好!我可以确认,将getActivity()的第二个参数设置为随机整数可以解决此问题。太糟糕了,它是一个不推荐使用的参数?@IgorG.:该参数没有被推荐使用。文档声称它未使用,但文档在这方面显然存在缺陷。有没有办法清除所有缓存的IntentExtras?我假设我现在已经修复了它,但旧的缓存意图仍然存在……根据意图的标志或活动的启动模式,可能会出现类似的问题。在这种情况下,您需要进行检查,因为Activity::getIntent将返回活动的原始意图,而不是更新了action/extras/etc的新意图。这不足以防止您的PendingIntent相互碰撞。您还必须使用PendingIntent.FLAG_UPDATE_current来生成唯一的_id,这是一个很好的解决方案
int unique_id=(int)System.currentTimeMillis()我不确定您是否可以在那里使用长整数,或者实际上可以使用任意的随机整数。IIRC,如果你使用“大”字节中的任何一位作为请求代码,Android会抛出一个异常,这基本上将你限制为小的正数-