2014-06-08 88 views
0

我有一個應用程序,使用GPS定期更新。它曾經是這樣的情況,當設備進入睡眠狀態(屏幕關閉,屏幕超時等)時,位置更新保持通過。這是在HTC Desire 2.2上運行的。「睡眠」問題與某些設備上的GPS位置更新

我需要這種行爲出於各種原因。

但是,現在正在運行4.0.4的HTC Desire S上進行測試,而且似乎發生的情況是更新在進入睡眠模式約5秒後繼續(1 /秒),但隨後停止。但是,運行在4.4.2的Google Nexus 7上運行的代碼完全相同,並且更新不斷髮布。

活動生命週期似乎在做所有正確的事情(onPause進入睡眠時,onResume退出睡眠時),但在Desire S上,位置更新停止。

雖然毫無疑問,它可以更有效地關閉它,但我需要它們。行爲似乎是操作系統和/或設備的依賴。我怎樣才能做到這一點?

編輯:實際上,我發現位置更新不斷出現,只是比請求的頻率少得多。

+0

你有聽衆在你的活動?當你註銷聽衆? – greywolf82

+0

它在onStop(),而不是onPause()中未註冊。所以就我所知,屏幕睡覺時不應該受到影響。 – nmw01223

+0

我與HTC One m7和m8有同樣的問題...你找到了解決方案嗎? – pdiddy

回答

0

其實最簡單的做法似乎是部分喚醒鎖定。

+0

好。我可以問你,如果你有onLocationChange()所有的執行流程?我的意思是:你是否使用其他線程來進行細化?我問你這個事情是因爲我看到了操作系統源代碼,並且我看到locationManager擁有一個喚醒鎖,直到onLocationChange()返回或者廣播接收者收到意圖(對於接口的意圖版本)。有趣的是,這款手機無法使用,也許是HTC的改變。 – greywolf82

+0

我在另一個線程上看到這是HTC Desire的一項功能。對於「正常」行爲,您必須在設置中禁用「省電模式」。 – greywolf82

+0

沒有其他線程,它沒有那麼多。我在請求位置更新時抓住了部分喚醒鎖定,並在取消時釋放它。當然,使用更多的電池,大約與舊款Desire相同,從不讓GPS睡在首位。所以我懷疑這是對S的節能改進。我無法找到任何可以讓我控制它的設置。 Google nexus 7也是如此。實際上,較舊的Desire具有更可靠的GPS。 – nmw01223

0

首先,只有onPause()以100%的概率被OS調用,onStop()和onDestroy()可能不會被OS調用。您應該註銷onPause(),此外設計是錯誤的,因爲要做到這一點,您有兩種選擇:

1)使用廣播接收器/意向服務的待處理意圖來管理位置;

2)使用前臺服務安裝位置監聽器。

活動這不是做這件事的好地方。

+0

重點在於當顯示進入睡眠狀態時,我需要保持處理位置更新。那是當onPause()被調用,所以取消註冊然後不起作用。我不明白爲什麼註冊一個服務的位置監聽器而不是一個活動會產生真正的區別,儘管我確實考慮過它。如果需要的話,操作系統也可以將服務吹走 - 這種情況發生的可能性較小。 – nmw01223

+0

這些活動是用於演示的操作系統組件,不用於後臺處理。您應該刪除onPause()中的任何偵聽器。也許問題在於操作系統調用你的onStop()。當然,這不是你想要的,因爲你想在屏幕關閉時運行,實際上我建議你改用服務。即使不需要,你也可以保持一個部分喚醒鎖以確保CPU保持清醒狀態。 – greywolf82

+0

操作系統不調用onStop(),我檢查了所有的流程。它只是調用onPause(),然後onResume()出來睡覺,正如我所期望的。我在上面提出你的觀點,但不要認爲這是問題。相反,系統似乎決定在睡覺時將GPS置於低功耗模式,毫無疑問,它可以節省功耗,但對我無能爲力。正如我所說,運行2.2.2的HTC Desire不會。有趣的是,該設備雖然從來沒有看到太多的衛星,但也產生了更好的精度,降至2米,而Desire S或Nexus 7從未低於4-5米。 – nmw01223