applicationDidEnterBackground总是在applicationWillTerminate之前调用?

applicationDidEnterBackground总是在iOS应用applicationWillTerminate之前调用? 我知道applicationWillTerminate并不总是被调用(多任务) – 但是当它被调用时, applicationDidEnterBackground总是被调用? 如果它已经包含在applicationDidEnterBackground ,那么我不想不必要地将代码复制到applicationDidEnterBackground ,以便支持多任务的应用程序。

在ios 4.0和更高版本中applicationDidEnterBackground被调用,而不是applicationWillTerminate所以你不必调用它们两个。 以下是苹果文档的一部分:

讨论

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

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

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

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

有关如何正常转换到背景的更多信息,以及有关如何在退出时启动后台任务的信息,请参阅iOS应用程序编程指南。

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

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

希望这可以帮助。 🙂