繁体   English   中英

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

[英]When an iOS application goes to the background, are lengthy tasks paused?

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

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

如果我的应用程序正在执行一个非常耗时的操作(例如下载一个大文件)并且用户导致我的应用程序进入后台怎么办? 当用户回到我的应用程序时,该操作会自动暂停和恢复吗?

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

如果当用户让我的应用程序 go 到后台时,我的应用程序的执行只是在一个方法的中间怎么办?

例如,我的应用正在做

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

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

来自iOS 应用程序编程指南

您的应用委托的applicationDidEnterBackground:方法大约有 5 秒的时间来完成所有任务并返回。 在实践中,此方法应尽快返回。 如果该方法在时间用完之前没有返回,您的应用程序将被杀死并从 memory 中清除。 如果您仍然需要更多时间来执行任务,请调用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 分钟)时会发生的情况。 这是文档的链接

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM