【问题标题】:Android keeps caching my intents Extras, how to declare a pending intent that keeps fresh extras?Android 不断缓存我的 Intents Extras,如何声明一个未决的 Intent 来保留新的 Extras?
【发布时间】:2010-06-29 11:12:53
【问题描述】:

几天前,我一直在努力寻找一种方法来为我的闹钟使用自定义意图。虽然我得到了明确的答案,但我必须根据一些唯一的 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 和有关消息的详细信息
  • 随消息一起引发通知
  • 用户对通知的操作和应用程序显示意图传递的消息

问题

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

因此,在某种程度上,意图是缓存和重用以前的附加内容。如何使每个联系人和每个操作都独一无二?

【问题讨论】:

  • 有没有办法清除所有缓存的 IntentExtras?我想我现在修复了它,但旧的缓存意图仍然存在......
  • 根据 Intent 的标志或活动的启动模式,可能会出现类似的问题。在这种情况下,您需要检查Activity::onNewIntent,因为 Activity::getIntent 将返回 Activity 的 ORIGINAL Intent,而不是更新后的 action/extras/etc 的新 Intent。

标签: android android-intent extras


【解决方案1】:

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

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

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

更新

此外,getActivity() 的第二个参数和PendingIntent 上的 kin 显然可用于为相同的底层 Intent 创建不同的 PendingIntent 对象,尽管我从未尝试过。

【讨论】:

  • 我最终为操作添加了时间戳。
  • 太棒了!我使用我当前的小部件 ID 来分隔它们(也允许某种程度的缓存)。
  • 我有一个关于setAction() 的快速问题。它究竟是做什么的?我看了看文档,还是有点乱。
  • 很好的答案!我可以确认将 getActivity() 的第二个参数设置为随机整数可以解决此问题。太糟糕了,它是一个已弃用的参数?
  • @IgorG.:该参数未被弃用。文档声称它未使用,但文档在这方面显然存在缺陷。
【解决方案2】:

我通常指定唯一的 requestCode 以防止我的 PendingIntents 相互覆盖:

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

在你的情况下,我同意 CommonsWare 你只需要 FLAG_UPDATE_CURRENT 标志。新的附加值将覆盖旧值。

【讨论】:

  • 这不足以防止您的 PendingIntent 相互碰撞。您还必须使用 PendingIntent.FLAG_UPDATE_CURRENT
  • 并在这里生成一个 unique_id 是很好的解决方案int unique_id = (int) System.currentTimeMillis();
  • 我不确定您是否可以在那里使用 Long ,或者实际上是任意随机 Int 。 IIRC,如果您将“较大”字节中的任何位用于请求代码,Android 将引发异常,这基本上将您限制为小的正数。
  • 是的,找到了,像这样 - stackoverflow.com/questions/33331073/…
猜你喜欢
  • 2014-03-01
  • 2019-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多