7

是否applicationDidEnterBackground总是applicationWillTerminate在 iOS 应用程序中调用过?我知道这applicationWillTerminate并不总是被调用(多任务处理) - 但是当它被调用时,applicationDidEnterBackground总是首先被调用吗?对于支持多任务处理的应用程序,applicationWillTerminate如果已经包含在其中,我不想不必要地重复代码。applicationDidEnterBackground

4

1 回答 1

6

在 ios 4.0 及更高版本applicationDidEnterBackground中调用而不是,applicationWillTerminate因此您不必同时调用它们。以下是 Apple 文档的一部分:

讨论

在 iOS 4.0 及更高版本中,当用户退出支持后台执行的应用程序时,将调用此方法而不是 applicationWillTerminate: 方法。您应该使用此方法来释放共享资源、保存用户数据、使计时器无效并存储足够的应用程序状态信息以将您的应用程序恢复到其当前状态,以防以后终止。您还应该禁用对应用程序用户界面的更新,并避免使用某些类型的共享系统资源(例如用户的联系人数据库)。您还必须避免在后台使用 OpenGL ES。

您对此方法的实现大约有五秒钟的时间来执行任何任务并返回。如果您需要额外的时间来执行任何最终任务,您可以通过调用 beginBackgroundTaskWithExpirationHandler: 从系统请求额外的执行时间。在实践中,您应该尽快从 applicationDidEnterBackground: 返回。如果该方法在时间用完之前没有返回,则您的应用程序将被终止并从内存中清除。

您应该在此方法退出之前执行与调整用户界面相关的任何任务,但其他任务(例如保存状态)应根据需要移动到并发调度队列或辅助线程。因为您在 applicationDidEnterBackground: 中启动的任何后台任务很可能在该方法退出之后才会运行,因此您应该在启动这些任务之前请求额外的后台执行时间。换句话说,首先调用 beginBackgroundTaskWithExpirationHandler: 然后在调度队列或辅助线程上运行任务。

应用程序还会在调用此方法的同时发布 UIApplicationDidEnterBackgroundNotification 通知,让感兴趣的对象有机会响应转换。

有关如何优雅地过渡到后台的更多信息,以及有关如何在退出时启动后台任务的信息,请参阅 iOS App Programming Guide。

希望这有助于为您解决问题。阿德里安

这是开发人员部分提供的技术说明的链接。它正在处理网络和多任务处理。本文档中使用的实际方法仅处理applicationDidEnterBackground自 iOS 5 以来,他们有一个称为watchdog的系统,如果网络自动无响应,它会终止应用程序。因此,无需实际调用applicationWillTerminate并尝试执行代码以允许您的应用程序在应用程序终止之前完成其任务。该应用程序将进入后台并继续其任务,直到最后一个任务完成。我希望这是有道理的,但这是链接。请阅读看门狗部分。 https://developer.apple.com/library/ios/#technotes/tn2277/_index.html#//apple_ref/doc/uid/DTS40010841

希望这可以帮助。:)

于 2012-12-05T16:45:21.613 回答