应用程序在进入后台时停止运行

Posted

技术标签:

【中文标题】应用程序在进入后台时停止运行【英文标题】:App stops running when put into background 【发布时间】:2013-09-07 17:40:32 【问题描述】:

我正在做一个时钟应用程序;带秒表和计时器。当我的应用程序进入后台(即用户进入主屏幕、切换到另一个应用程序或锁定手机)时,计时器和秒表停止计数。我知道有几个应用程序在进入后台后会继续工作。

是否有我可以更改的设置以使其保持运行?

【问题讨论】:

这将对您有所帮助:Tutorial 您的应用需要从前台更新显示。基本上跟踪它进入后台的时间,并在它进入前台时进行相应的更新。 【参考方案1】:

您需要在进入后台时保存状态,然后在返回前台时恢复状态。这意味着计时器和实际计时数据。

【讨论】:

【参考方案2】:

您的问题的简短答案是您不能让您的应用程序在后台模式下执行某些操作。

Here you can find Apple's Doc, which says what can work in background.

对于您的情况,当调用此 AppDelegate 的方法 applicationDidEnterBackground 并在 applicationDidBecomeActive 方法中更新经过的时间时,很容易实现秒表保存当前时间,例如在 NSUserDefaults

【讨论】:

【参考方案3】:

为乔治的答案添加代码:

在你的applicationDidEnterBackground

NSDate *currentDate= [NSDate date];
[[NSUserDefaults standardUserDefaults] setObject:currentDate forKey:@"backgroundDate"];

在你的applicationDidBecomeActive

NSDate *dateWhenAppGoesBg= (NSDate *)[[NSUserDefaults standardUserDefaults] objectForKey:@"backgroundDate"];
NSTimeInterval timeSpentInBackground = [[NSDate date] timeIntervalSinceDate:dateWhenAppGoesBg];

现在您可以在几秒钟内获得timeSpentInBackground,您可以从中更新 UI 或执行其余任务。

【讨论】:

感谢您的回答,但是如何在 viewController.m 文件中访问timeSpentInBackground 您可以从 applicationDidBecomeActive 发布 NSNotification。请查看我在这篇文章中的回答,了解如何使用它。 ***.com/questions/17702022/…. 我不太清楚如何实现,AppDelegate 中有哪些部分,viewcontroller.m 中有哪些部分? 您需要在您的 viewcontroller.m 中注册一个通知方法,并从您的 appDelegate 中的 applicationDidBecomeActive 发布通知。因此 viewcontroller.m 通知方法将被调用,您可以在那里使用该值。清楚了吗? 有点,变量是如何传递的?我很困惑【参考方案4】:

像这样创建变量

self.timeBeforeGoingBackgound = [NSDate date];

然后你可以得到时间使用

[[NSDate date] timeIntervalSinceDate:self.timeBeforeGoingBackgound];

【讨论】:

如果应用程序在后台被杀死然后完全重新启动,这将不起作用。日期需要保留。 可以在 unserdefaults 中而不是变量中读取/写入它...这将起作用 @samfisher 没错。该值需要保持不变。 NSUserDefaults 是一个很好的地方。

以上是关于应用程序在进入后台时停止运行的主要内容,如果未能解决你的问题,请参考以下文章

AVFoundation -AVCaptureSession 仅在进入后台并返回断点时停止并开始运行

Android 进入后台时游戏也停止运行了,怎么破

当应用程序进入后台时停止后台服务

iOS解决应用进入后台后计时器和位置更新停止的问题

当应用程序进入后台时停止 AVAudioPlayer 音乐

在 iOS 上,当应用程序进入后台时 UnityWebRequest 下载停止