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

时间:2011-07-11 13:22:06

标签: iphone multitasking

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

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

如果我的应用程序执行了相当长时间的操作(例如下载大文件)并且用户导致我的应用程序进入后台,该怎么办?当用户回到我的应用程序时,该操作是否会自动暂停和恢复?

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

如果用户让我的应用程序进入后台,我的应用程序的执行只是在方法的中间,该怎么办?

例如,我的应用正在进行

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

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

3 个答案:

答案 0 :(得分:72)

来自iOS App Programming Guide

  

您的app委托的applicationDidEnterBackground:方法有   大约5秒钟完成任务并返回。在实践中,   这种方法应该尽快返回。如果方法有   在时间用完之前没有返回,你的应用程序被杀死并被清除   记忆。如果您还需要更多时间来执行任务,请致电   请求背景的beginBackgroundTaskWithExpirationHandler:方法   执行时间然后启动辅助中的任何长时间运行的任务   线。无论你是否开始任何后台任务,都可以   applicationDidEnterBackground:方法仍必须在5内退出   秒。

如果您在上面描述的长时间运行操作在主线程上,并且在您的应用程序转到后台后需要超过5秒才能完成,您的应用程序将被终止。主线程将被阻止,您将无法及时从-applicationDidEnterBackground:返回。

如果你的任务是在后台线程上运行的(如果它需要很长时间才能执行),如果应用程序从-applicationDidEnterBackground:返回,那么该线程似乎暂停(根据{{1}}中的讨论{3}})。当应用程序返回到前台时,它将恢复。

但是,在后一种情况下,您仍然应该准备好在您的申请在后台通过在前往后台的路上清理时随时终止。

答案 1 :(得分:10)

如果你正在做一些可能消耗时间并且你不想杀死它的操作,那么你可以通过在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分钟)将发生的事情。 以下是documentation

的链接

答案 2 :(得分:0)

如上所述,在某些情况下,您的应用会在后台运行,苹果可以根据您的操作允许或拒绝。

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

更重要的是,如果您确实符合其中一个类别,则您的应用刷新率由Apple算法决定,该算法会考虑您在该设备上的应用使用情况与其他应用的比较。如果您的应用更频繁地使用,那么它会分配更多的后台时间。这只是一个变量,但您可以了解后台时间分配因app而异,并且不受您的控制。