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


72

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

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

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

当我的应用进入后台或在前台继续运行时,幕后究竟会发生什么?

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

例如,我的应用正在执行

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

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


3
我认为这是一个很好的问题,但是您是否真的花了时间测试并弄清楚当它到达背景时会发生什么?我的意思是,将NSLog放在循环中的某个地方,看看会发生什么……
MiguelB 2011年

2
首先,建议遵循以下micpringle的建议。其次,如果我没记错的话,难道没有七个允许在后台运行的非常特定的API吗?查看这些内容,看看它们是否符合要求。如果没有,也许您需要重新设计应用程序执行操作的方式。
J. Steen

Answers:


75

iOS App编程指南中

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

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

如果您的任务在后台线程上运行(如果确实需要花费很长时间,那么它确实应该在后台线程上运行),那么如果应用程序从中返回-applicationDidEnterBackground:(根据此答案中的讨论),则该线程似乎已暂停。当应用程序回到前台时,它将恢复。

但是,在后一种情况下,您仍然应该为清理应用程序做好准备,使其在处于后台的任何时候都被终止,方法是清理您去往后台的方式。


这很混乱。beginBackgroundTaskWithExpirationHandler授予您的应用程序10分钟(很多时间!)来完成操作,但是“仍准备为在后台运行时随时终止您的应用程序做准备”?哪个是真的?我的大约10秒钟任务是使用CoreGraphics渲染图像(作为缩略图)并在后台任务上对其进行处理,然后它们挂起了!!!应用永远进入后台。在“ beginBackgroundTaskWithExpirationHandler”时段内,应用程序可以使用什么?
Motti Shneor

11

如果您正在执行一些可能会浪费时间的操作,并且不想杀死它,则可以通过在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分钟)时将发生的情况。这是文档的链接


当应用程序进入后台时,此方法有效。应用程序被杀死时的解决方案是什么,例如applicationWillTerminate(_ application: UIApplication)
Nij

您能否再详细说明一点?1.)正确的时间是在什么时候调用“ beginBackgroundTaskWithExpirationHandler”?我可以从'applicationWillResignActive'或'applicationDidEnterBackground'内部做到吗?2)当应用程序在后台时,将调用过期处理程序吗?在什么线程/队列上?在此处理程序中可以做什么,不能做什么?3.)我的应用使用CoreGraphics在后台渲染图像-一些CG方法将其线程挂在后台。他们会在这样的“ backgroundTask”中更好地生存吗?
Motti Shneor

0

如上文所述,在某些情况下,您的应用程序在后台运行,而Apple可以根据您的操作来允许或拒绝。

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

更重要的是,如果您确实属于这些类别之一,则应用程序的刷新率由苹果算法确定,该算法考虑了该设备与其他应用程序在该设备上的使用情况。如果您的应用被更频繁地使用,则会分配更多的后台时间。这只是一个变量,但您会想到后台时间分配因应用程序而异,不受您的控制。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.