当 iOS 应用程序进入后台时,冗长的任务是否会暂停?

是的,我知道如果我希望我的应用程序能够响应用户的多任务操作,比如切换到另一个应用程序,我应该处理

- (void)applicationWillResignActive:(UIApplication *)application
- (void)applicationDidBecomeActive:(UIApplication *)application

如果我的应用程序正在做一个相当长的时间消耗操作(如下载一个大文件) ,用户导致我的应用程序进入后台?当用户回到我的应用程序时,这个操作会自动暂停并恢复吗?

当我的应用程序进入后台或在前台恢复时,幕后究竟会发生什么?

如果用户让我的应用程序去后台,我的应用程序的执行正好是在一个方法的中间?

例如,我的应用程序正在做

for (int i = 1 to 10000K) {
do some calculation;
}

当 i = = 500K 时,用户切换到另一个应用程序?

68780 次浏览

来自 文件:

尽快从 applicationDidEnterBackground(_:)返回。此方法的实现大约有5秒钟来执行任何任务并返回。如果该方法在时间耗尽之前没有返回,那么您的应用程序将被终止并从内存中清除。

如果需要额外的时间来执行任何最终任务,请通过调用 beginBackgroundTask(expirationHandler:)从系统请求额外的执行时间。尽早呼叫 beginBackgroundTask(expirationHandler:)。因为系统需要时间来处理您的请求,所以在任务断言被授予之前,系统可能会挂起您的应用程序。例如,不要在 applicationDidEnterBackground(_:)方法的最后调用 beginBackgroundTask(expirationHandler:),并期望应用程序继续运行。

如果上面描述的长时间运行的操作在主线程上,并且在应用程序进入后台后花费超过5秒钟的时间才能完成,那么您的应用程序将被终止。主线程将被阻塞,您将没有机会及时从 -applicationDidEnterBackground:返回。

如果任务在后台线程上运行(如果执行时间很长,那么它确实应该在后台线程上运行) ,那么如果应用程序从 -applicationDidEnterBackground:返回(根据 这个答案中的讨论) ,那么该线程似乎会暂停。当应用程序被带回到前台时,它将被恢复。

然而,在后一种情况下,您仍然应该为您的应用程序在任何时候终止做好准备,当它在后台的时候,您可以在前往后台的路上清理东西。

如果您正在执行一些可能会消耗时间的操作,并且您不想杀死它,那么您可以通过在 UIBackground Task i 中执行来延长操作的时间

{
UIBackgroundTaskIdentifier  taskId = 0;
taskId = [application beginBackgroundTaskWithExpirationHandler:^{
taskId = UIBackgroundTaskInvalid;
}];


// Execute long process. This process will have 10 mins even if your app goes in background mode.


}

名为“ Handler”的块参数是后台任务到期(10分钟)时发生的情况。 这里有一个链接到 < a href = “ http://developer.apple.com/library/ios/# DOCUMENTATION/UIKit/Reference/UIApplication _ Class/Reference/Reference.html”rel = “ noReferrer”> 文档

如上所述,有一些情况下,你的应用程序运行在后台,苹果可以允许或拒绝取决于你在做什么。

Https://developer.apple.com/library/ios/documentation/iphone/conceptual/iphoneosprogrammingguide/managingyourapplicationsflow/managingyourapplicationsflow.html

更重要的是,如果你符合这些类别之一,你的应用程序刷新率是由苹果算法,考虑到你的应用程序使用该设备与其他应用程序。如果你的应用程序被使用的更频繁,那么它得到更多的后台时间分配。这只是一个变量,但你得到的想法,背景时间分配不同的应用程序,而不是在你的控制。