0

我正在寫一個應用程序運行在後臺模式,可以跟蹤用戶(所以有時更新位置在後臺模式),並通過使用區域監控,通知他的附近點。我不使用重新啓動區域監視應用程序的功能。applicationDidEnterBackground後applicationWillTermimate應用程序與背景位置模式

當前,獲取applicationWillTerminate:消息後,我停止位置更新並刪除區域監視的所有點。我注意到應用程序的奇怪行爲。以下消息(按順序如下圖所示)正試圖殺死它在多任務菜單後,交付給應用程序:

  • applicationWillTerminate:
  • applicationDidEnterBackground:
  • (有時)多了一個locationManager:didUpdateToLocation:fromLocation:

如果我沒有爲這個應用程序註冊後臺定位模式,它只是被殺死。

我想要應用程序終止像其他應用程序後,用戶在多任務菜單中殺死它,而不是從區域監控(沒有點在那個時刻跟蹤)消息。不過,我需要能夠使用後臺定位模式。目的是儘量減少電池的使用。我該怎麼做才能做到這一點?

此外,爲什麼申請在applicationWillTerminate:之後收到applicationDidEnterBackground:?從多任務菜單關閉後它仍在運行嗎?

回答

2

最後,我通過實驗對它進行了測試,並檢查文檔中涵蓋的所有內容是否屬實。它似乎是。那些是結果,未完全在文檔中指定:

如果該應用程序不支持UIBackgroundModeslocation,它被殺死(接收信號9)在多任務菜單終止之後(接收applicationWillTerminate:之後)。

如果應用程序支持location後臺模式,它會收到applicationWillTerminate:,applicationDidEnterBackground:並被掛起。在下次啓動應用程序之前,它會被靜默終止。

如果您正在監控應用程序中的某個區域,並且它在多任務菜單中被終止,那麼它將通過UIApplicationLaunchOptionsLocationKey選項在區域事件中重新啓動。如果用戶在此之後啓動應用程序,則不會終止,而只是開始獲取applicationDidBecomeActive:和其他消息。

正如預期的那樣,如果您停止監視所有地區的applicationWillTerminate:方法,應用程序在終止後不會耗盡電池。但是,如果你不停止監視區域並且設置了高區域監視精度,那麼即使終止(因爲iOS正在主動監視那些點),它也會耗盡大量電量。

無論您是否監控區域,終止後應用程序的行爲與設置的後臺定位模式實際上是相同的。只有在第一種情況下,它纔不會獲得有關進入區域的信息,也不會消耗電池。

0

它總是會收到這些通知(因此會輸入這些方法),因爲這些通知將始終作爲應用程序的終止進程的一部分發送。是的,當這些方法運行時,應用程序仍然運行,但在方法結束後它將不再運行。

如果我明白你要完成的任務,那麼你應該根據你在applicationDidEnterBackground:方法中的要求停止監視。

希望有所幫助。

+0

問題是應用程序在'applicationWillTerminate:'之後運行。之後,調用'applicationDidEnterBackground:'。問題是何時(如果曾經)它被殺死。 另外,我想在用戶「殺死」應用程序時停止監視區域,所以我不能在'applicationDidEnterBackground:'中執行。 – Xilexio

+0

根據iOS 4.0及更高版本的文檔,您的應用程序在applicationDidEnterBackground後清除,請參閱此處的文檔:http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIApplicationDelegate_Protocol/Reference/Reference .html –

+0

它只聲明應用程序可能在'applicationDidEnterBackground:'後終止。例如,如果我使用區域監視,它將使用'application:didFinishLaunchingWithOptions:'與選項'UIApplicationLaunchOptionsLocationKey'一起運行。由於我沒有使用它的功能來喚醒跨越區域邊界的應用程序,因此我預計它會關閉或者至少不會耗盡電池。但是,當我檢查系統控制檯應用程序時,我的應用程序沒有被髮送kill(9)信號,而沒有設置後臺模式,它被終止。 – Xilexio