0

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

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

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

如果我没有为此应用程序注册后台定位模式,它就会被杀死。

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

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

4

2 回答 2

2

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

如果应用程序不支持UIBackgroundModeslike location,则在多任务菜单中终止它后(接收信号 9)将被杀死(接收信号 9 applicationWillTerminate:)。

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

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

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

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

于 2012-08-23T10:42:23.487 回答
0

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

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

希望有帮助。

于 2012-08-22T14:17:17.553 回答