【问题标题】:Clarification on the docs for PendingIntent.FLAG_CANCEL_CURRENT澄清 PendingIntent.FLAG_CANCEL_CURRENT 的文档
【发布时间】:2013-02-23 17:11:57
【问题描述】:

来自Android中的documentation of Pending Intent FLAG_CANCEL_CURRENT

通过取消之前的待处理意图,这可以确保只有获得新数据的实体才能启动它。如果此保证不是问题,请考虑 FLAG_UPDATE_CURRENT

谁能解释一下这条线是什么意思?

【问题讨论】:

  • @VikalpPatel - 你的编辑是错误的 - 操作是正确的 - 请小心

标签: android


【解决方案1】:

一旦您使用FLAG_CANCEL_CURRENT 创建了一个新的PendingIntent,任何拥有相同PendingIntent 的先前Intent 将不再能够执行原来的PendingIntent

例如,假设我们有这个:

Intent i=new Intent(this, Foo.class);

i.putExtra("key", 1);

PendingIntent pi=PendingIntent.getActivity(this, 0, i, 0);

我们将PendingIntentNotification 一起使用。

稍后,我们执行:

Intent i=new Intent(this, Foo.class);

i.putExtra("key", 2);

PendingIntent pi2=PendingIntent.getActivity(this, 0, i, PendingIntent.FLAG_CANCEL_CURRENT);

此时,最初创建的 PendingIntent (pi) 不再有效,无论我们使用 pi2 做什么,都会看到更新后的额外值 (2)。

如果我们这样做了:

Intent i=new Intent(this, Foo.class);

i.putExtra("key", 2);

PendingIntent pi2=PendingIntent.getActivity(this, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);

此时,pipi2 都代表相同 PendingIntent,并且两者都会看到更新后的额外值 (2)。

或者,如果我们这样做了:

Intent i=new Intent(this, Foo.class);

i.putExtra("key", 2);

PendingIntent pi2=PendingIntent.getActivity(this, 0, i, 0);

此时,pipi2 仍然代表相同的 PendingIntent,但附加项不变,因为 getActivity() 返回 原始 PendingIntent 而不应用新附加项.

大多数时候,当您尝试替换 PendingIntent 中的额外内容时,FLAG_UPDATE_CURRENT 是一个很好的答案。

【讨论】:

  • Intent i=new Intent(this, Foo.class); i.putExtra("key", 1); PendingIntent pi=PendingIntent.getActivity(this, 0, i, 0); AlarmManager am = Context.getSystemService(Context.ALARM_SERVICE); am.set(ELAPSED_REALTIME,mTime,pi); Intent i=new Intent(this, Foo.class); i.putExtra("key", 2); PendingIntent pi2=PendingIntent.getActivity(this,0,i,PendingIntent.FLAG_CANCEL_CURRENT); am.set(ELAPSED_REALTIME,mTime1,pi2);那么,现在当警报管理器在时间 mTime 到期时,将不会调用待处理的意图 pi?
  • @pikini:我希望PendingIntent.CanceledException 会被抛出。据推测,AlarmManager 有逻辑来处理这个问题。但是,如果您想取消警报,最好致电cancel() 而不是让AlarmManager 处理异常,恕我直言。
  • 感谢您的回答。我会尝试这样做并分享我的结果。感谢您抽出宝贵时间回复。
  • PendingIntent.FLAG_UPDATE_CURRENT At this point, pi and pi2 both represent the same PendingIntent, and both will see the updated extra value (2). 假设他们都注册了警报管理器,当警报时间到达时,两者都会被执行,如果 PendingIntent.FLAG_CANCEL_CURRENT 用于上述情况怎么办?
  • @MuhammadBabar:“假设如果他们都在警报管理器中注册,并且当警报时间到达时,两者都会被执行”——对于真正等效的 PendingIntent 对象,第二个警报将取消安排第一个警报.对于等效的 PendingIntent 对象,您不能有两个未完成的警报。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-01
  • 2018-11-12
  • 2020-07-30
  • 2020-04-02
  • 2020-09-23
  • 1970-01-01
  • 2019-11-15
相关资源
最近更新 更多