FLAG_CANCEL_CURRENT 或 FLAG_UPDATE_CURRENT
Posted
技术标签:
【中文标题】FLAG_CANCEL_CURRENT 或 FLAG_UPDATE_CURRENT【英文标题】:FLAG_CANCEL_CURRENT or FLAG_UPDATE_CURRENT 【发布时间】:2012-12-11 08:25:48 【问题描述】:我的应用在用户交互时设置了重复警报,它可能 使用警报管理器更改为广播设置的间隔时间。 没有太多额外的方式。 在这种情况下更新或取消标志更好吗?
谢谢
【问题讨论】:
'There is not much in the way of extras' 是什么意思?您是否使用附加功能? 不,我没有使用附加功能.. 请注意三星棒棒糖在使用 FLAG_CANCEL_CURRENT 时会出现问题。参考***.com/questions/29344971/… 【参考方案1】:切勿将 FLAG_CANCEL_CURRENT 与您在设置警报时使用的 PendingIntent 一起使用。如果您想将警报重新安排在不同的时间,则根本不需要任何标志;只需创建一个带有零标志的重复 PendingIntent,然后使用它来设置()警报:这将隐式取消现有警报,然后将其设置为新指定的时间。但是,如果您在创建新的 PendingIntent 时使用了 FLAG_CANCEL_CURRENT,它会破坏警报管理器识别它与现在已取消的 PendingIntent“相同”的能力,并且您最终会发现旧的挂起、无法交付、占用内存和 CPU。我已经看到有这个错误的应用程序在系统中积累了数百个过时的警报,足以对性能和内存使用造成显着影响。
如果您只想更改附加内容而不实际重新安排现有警报,这就是 FLAG_UPDATE_CURRENT 的用途。如果您想重新安排,请不要使用任何标志。
【讨论】:
您的回答听起来与 android 文档状态关于FLAG_CANCEL_CURRENT
的内容相反。您对此答案有任何参考吗?我目前遇到了一个问题,我怀疑FLAG_UPDATE_CURRENT
没有正确更新意图,因此我最终会出现一些意外行为。我想将其更改为使用FLAG_CANCEL_CURRENT
,那时我看到了这个答案。
你在读什么听起来很矛盾? d.android.com 说 FLAG_CANCEL_CURRENT “确保只有给定新数据的实体才能启动它”——旧的 PendingIntent 无效,只有新的 PendingIntent 可以工作,并且两者上的 .equals() 返回 false。如果您对 FLAG_UPDATE_CURRENT 不更改附加内容有疑问,那是一个单独的语义。
我发现您关于将标志设置为 0 的评论相互矛盾。您已经写过,如果标志设置为 0,则 PendingIntent
将被隐式取消,但如果标志设置为 FLAG_CANCEL_CURRENT
,则旧标志将无法交付。我写了一个小测试,在其中创建了两个具有相同requestCode
的 PendingIntent。当我将标志设置为 0 时,之前的 PendingIntent
在我对其调用 send
时仍然有效。当我将标志设置为FLAG_CANCEL_CURRENT
时,之前的意图被取消,我无法发送。
对不起;我不太明白。我写了“这将隐式取消现有的警报”——它取消了 警报, 而不是 PendingIntent。你所描述的看到——在使用 FLAG_CANCEL_CURRENT 之后,以前的 PendingIntent 实例不再可用——这正是我说你不能将该标志与与警报关联的 PendingIntent 一起使用的原因。【参考方案2】:
如果您不使用附加功能,则不必指定任何这些标志。他们只改变系统如何处理带有PendingIntent
的额外内容:替换当前匹配中的那些(由系统缓存PendingIntent
)或取消它并创建一个新的。详细参考文档:http://developer.android.com/reference/android/app/PendingIntent.html#FLAG_CANCEL_CURRENT
【讨论】:
既然他不需要 CANCEL,那么FLAG_UPDATE_CURRENT
就是要走的路——否则就会产生创建新对象的不必要开销。
此外,使用 CANCEL 可能会导致PendingIntent.CanceledException
CANCEL_CURRENT 是否会导致额外内容从持有该意图的活动中消失?以上是关于FLAG_CANCEL_CURRENT 或 FLAG_UPDATE_CURRENT的主要内容,如果未能解决你的问题,请参考以下文章
无法在 facebook 上共享 .fla 文件或其发布的 html 版本