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

是的,我知道如果我希望自己的应用能够响应用户的多任务操作,例如切换到其他应用,我应该处理

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

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

当我的应用程序进入后台或在前台继续时,幕后会发生什么?

如果用户让我的应用程序转到后台,我的应用程序的执行只是在方法的中间?

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

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

当我== 500K,用户切换到另一个应用程序。 在我的应用程序for循环会发生什么?

从iOS应用程序编程指南 :

您的应用程序委托的applicationDidEnterBackground:方法有大约5秒钟来完成任何任务并返回。 实际上,这个方法应该尽快返回。 如果该方法在时间耗尽之前没有返回,则应用程序将被终止并从内存中清除。 如果仍然需要更多时间来执行任务,请调用beginBackgroundTaskWithExpirationHandler:方法来请求后台执行时间,然后在辅助线程中启动任何长时间运行的任务。 无论您是否启动任何后台任务, applicationDidEnterBackground:方法都必须在5秒内退出。

如果上面描述的长时间运行在主线程上,并且在应用程序返回后台需要超过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. } 

当后台任务到期(10分钟)时,将会发生称为“处理程序”的块参数。 这里是文档的链接

就像上面提到的,有几种情况,你的应用在后台运行,苹果可以允许或拒绝,取决于你在做什么。

https://developer.apple.com/library/ios/documentation/iphone/conceptual/iphoneosprogrammingguide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html

更重要的是,如果您符合其中一个类别,则您的应用刷新率由苹果algorithm决定,该algorithm会考虑您在该设备上的应用使用情况与其他应用的情况。 如果您的应用程序更经常使用,则会分配更多的背景时间。 这只是一个variables,但你有这样的想法,背景时间分配不同应用程序的应用程序,而不是在你的控制之下。