applicationWillTerminate之后的applicationDidEnterBackground用于具有后台位置模式的应用程序

时间:2012-08-22 13:17:31

标签: iphone ios5 core-location cllocationmanager uiapplicationdelegate

我正在编写一个以后台模式运行的应用程序,可以跟踪用户(因此有时会在后台模式下更新位置),并且通过使用区域监控,可以通知他附近的点。我没有使用从区域监控重新启动应用程序的功能。

目前,在收到applicationWillTerminate:消息后,我会停止位置更新并从区域监控中删除所有点。我注意到应用程序的奇怪行为。尝试在多任务菜单中将其终止后,以下消息(按照下面的顺序)传递给应用程序:

  • applicationWillTerminate:
  • applicationDidEnterBackground:
  • (有时)还有一个locationManager:didUpdateToLocation:fromLocation:

如果我没有为这个应用程序注册后台位置模式,那么它就会被杀死。

我希望应用程序在用户在多任务菜单中杀死它之后像其他应用程序一样终止,而不是从区域监控中获取消息(无论如何都没有跟踪点)。不过,我需要能够使用后台位置模式。目的是尽量减少电池的使用。我该怎么做才能实现这个目标?

此外,为什么应用程序会在applicationDidEnterBackground:之后收到applicationWillTerminate:?从多任务处理菜单关闭后它是否仍在运行?

2 个答案:

答案 0 :(得分:2)

最后,我通过实验对其进行了测试,并检查了文档中涵盖的所有内容是否属实。它似乎是。这些是结果,文档中没有详细说明:

如果应用程序不支持UIBackgroundModes location,则会在多任务菜单中终止后(在收到applicationWillTerminate:后)将其终止(接收信号9)。

如果应用程序支持location后台模式,则会收到applicationWillTerminate:applicationDidEnterBackground:并暂停。在下次启动应用程序之前,它会以静默方式终止。

如果您正在监视应用程序中的某个区域并且它已在多任务菜单中终止,则会在具有UIApplicationLaunchOptionsLocationKey选项的区域事件上重新启动它。如果用户在此之后启动应用程序,则不会终止该应用程序,而只是开始获取applicationDidBecomeActive:和其他消息。

正如预期的那样,如果您停止使用applicationWillTerminate:方法监控所有区域,则应用程序在终止后不会耗尽电池。但是,如果您没有停止监控区域并且设置了较高的区域监控精度,那么即使终止也会消耗大量电池(因为iOS正在积极监控这些点)。

终止后,具有设置后台位置模式的应用程序的行为实际上是相同的,无论您是否监视区域。只有在第一种情况下,它才会获得有关进入区域的消息,也不会消耗电池。

答案 1 :(得分:0)

它将始终接收这些通知(因此输入这些方法),因为这些通知将始终作为应用程序的终止进程的一部分发送。是的,当这些方法运行时,应用程序仍在运行,但在applicationWillTerminate方法结束后它将不再运行。

如果我理解您要完成的工作,那么您应该根据applicationDidEnterBackground:方法中的要求停止监控。

希望有所帮助。