当应用程序进入后台时,NSTimer 的行为是什么?

6
我知道当你将一个应用程序放到后台时,计时器会停止运行。但是,当你从后台返回时,计时器的行为如何呢?它是否保持原始的fireDate
我遇到了一个问题,即从后台返回时,一个被设置为10分钟后触发的NSTimer有时会在applicationWillEnterForeground:被调用之前立即触发。如果它没有触发,并且applicationWillEnterForeground:被调用,我有一些逻辑来检查是否已经过了10分钟,通过比较计时器的fireDate和当前日期,然而,即使已经过去了10分钟,它总是给我一个比当前日期晚约525秒的值。
我的理论如下:
  • 只要你没有错过计划的时间,一个NSTimer将在从后台返回时触发计时器。 (在这种情况下,我们将计时器设置为10分钟,只要你在后台停留时间在10-20分钟之间,它就会在重新进入应用程序时触发。)

  • 如果超过了计划的时间,它就不会触发,而是在你返回时为同样的时间段安排另一个计时器。 (也就是说,如果你在后台停留了20多分钟,而计时器设定了10分钟,当你回来时,它会在未来的10分钟内安排计时器。)

有人有关于这种行为的文档吗?我的理论只是基于观察,关于后台运行时会发生什么的文档要么缺乏,要么我没能找到它。
2个回答

9
你正确地观察到了NSTimer的行为。如果你现在创建一个计时器,应该每十分钟触发一次,它会尝试从现在开始的十分钟、20分钟、30分钟等时间触发。如果应用程序在一分钟后进入睡眠状态并在12分钟后唤醒,计时器将立即触发,然后再在20分钟时触发(不是在计时器触发后10分钟,而是在原始时间的20分钟后)。但是,如果计时器完全错过一个事件,然后下一个计时器事件也迟到了,比如说你在29分钟后唤醒,那么10分钟的事件会被丢弃,20分钟的事件会尽快触发(在29分钟后),30分钟的事件会在30分钟后触发。

2
这在NSTimer文档中有所体现:“如果一个计时器被安排在某个特定时间触发,并且每隔5秒触发一次,则预定的触发时间始终会落在原始的5秒时间间隔上,即使实际触发时间被延迟。如果触发时间被延迟到超过一个或多个预定触发时间,计时器仅在该时间段内触发一次;然后,在触发后,计时器将被重新安排在未来的下一个预定触发时间。” - joakim
有关一次性(非重复)计时器的任何想法吗?当返回前台时,它们是否也会触发,无论在后台花费的时间如何?此外 - 一些应用程序在后台中获取循环 - 所有媒体播放器,电话应用程序等。这些应用程序在后台运行时是否会触发计时器? - Motti Shneor

0

你不能使用计时器来解决这个问题。在调查类似问题后,我发现了以下内容:

  • 当应用程序在后台运行约30秒后,计时器会停止。
  • 当你从后台重新进入时,计时器会重新开始触发。

为了克服这个问题并正确添加此功能,您需要在后端服务器上实现计时器。当计时器启动时,命中一个服务并在应用程序处于前台时启动计时器。计时器将自己处理,但当应用程序被终止或在后台运行时,服务器将发挥作用。命中一个服务以获取经过的时间或在10分钟后发送推送通知。


所以我认为你描述的是一个稍微不同的问题。计时器似乎在继续监视,然后在你返回时被触发,但是,如果你等待足够长的时间,它似乎会在你回来时重新安排计时器而不是触发它。 - Bill L
嗯,我认为它的工作方式是在大约30-90秒后停止定时器,然后如果经过了特定的时间,它将会终止定时器。 - Ahmad Ishfaq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接