【问题标题】:applicationDidEnterBackground after applicationWillTermimate for application with background location modeapplicationDidEnterBackground 在 applicationWillTerminate 之后用于具有后台位置模式的应用程序
【发布时间】:2012-08-22 13:17:31
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: iphone ios5 core-location cllocationmanager uiapplicationdelegate


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      希望对您有所帮助。

      【讨论】:

      • 问题是应用程序在applicationWillTerminate: 之后运行。之后,applicationDidEnterBackground: 被调用。问题是它何时(如果有的话)被杀死。另外,一旦用户“杀死”应用程序,我想停止监视区域,所以我不能在applicationDidEnterBackground: 中这样做。
      • 根据 iOS 4.0 及更高版本的文档,您的应用程序在 applicationDidEnterBackground 后被清除,请参阅此处的文档:developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/…
      • 它只声明应用程序可能在applicationDidEnterBackground:之后终止。例如,如果我使用区域监控,它将使用application:didFinishLaunchingWithOptions: 和选项UIApplicationLaunchOptionsLocationKey 运行。由于我没有使用它的功能来唤醒跨越区域边界的应用程序,我希望它会被关闭或至少不会耗尽电池。但是,当我使用 System Console 应用程序检查时,我的应用程序没有被发送 kill (9) 信号,而没有设置后台模式,它被杀死了。
      猜你喜欢
      • 1970-01-01
      • 2014-05-12
      • 1970-01-01
      • 1970-01-01
      • 2013-03-09
      • 1970-01-01
      • 2020-02-19
      • 1970-01-01
      • 2012-06-16
      相关资源
      最近更新 更多