在我開發的Android應用程序中,我需要LocationManager來給我定位修復。那一部分都很好,很好;它工作,已經有相當一段時間了,並且所有人都很高興。Android的LocationManager忽略requestLocationUpdates調用中的更改,但僅限於Droid
但是,現在我最近還添加了一項功能,允許位置跟蹤部分轉到後臺,我還希望允許它在這種情況下減慢更新以節省電池電量。實際上,我試圖這樣做的方式是通過使用新參數重新發出requestLocationUpdates調用,如果我的後臺服務檢測到沒有任何已註冊的監聽器(它向通知欄提供了某些內容,所以我仍然希望它獲得更新)。我們稱之爲「Servicemajig」服務。我這樣做的方式,總之:
private void setMode(boolean foreground) {
// This sets whether we're in foreground or background mode. If we're
// not changing anything, though, don't do anything.
if(foreground == mForeground) return;
// Set the current mode...
mForeground = foreground;
// ...and switch!
if(mForeground) {
// Foreground mode means we go full tilt.
Log.i(DEBUG_TAG, "Switching to foregroud mode...");
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, Servicemajig.this);
} else {
// Background mode means we slow down. Like, say, 30 seconds.
Log.i(DEBUG_TAG, "Switching to background mode...");
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 30000, 0, Servicemajig.this);
}
}
現在,這項工作,大部分。我沒有得到雙重更新(即我沒有取消註冊,但它仍然有效),在我的Nexus One和G1上,它可以根據需要正確切換背景和前景模式。也就是說,在嘗試獲得另一個定位點之前,它會正確等待約30秒(給予或帶走),從而節省電池電量。
問題出現在我在摩托羅拉Droid上測試的時候。在Droid上,一旦我把它放在後臺模式下,它將在修復之間等待30秒(再次給予或取出),但是如果它以這種方式獲得至少一個修復,它將不會返回稍後再轉到前臺模式。也就是說,即使在我重新輸入了前臺模式所需和要求的實際應用程序之後,它仍然等待每次修復30秒,除了關閉Servicemajig並重新啓動它之外,似乎無法解決此問題。日誌顯示它正在通過那部分代碼,所以它至少得到了那麼多。
所以我的問題是,這只是一個特定於Droid固件的錯誤?有什麼方法可以解決這個問題嗎?或者,這是否是正確的方式來做這樣的事情?我會注意到,如果使用registerLocationUpdates調用在if塊之前添加removeUpdates調用,則無關緊要。
你有一個標準設置? – Skizit 2010-06-10 15:55:14
我在這裏沒有任何情況下的Criteria集。我只是明確地使用可用的提供者。 我給出的代碼是刪節的;我還從NETWORK_PROVIDER請求位置更新,並根據每次更新來確定我接受的位置。然而,在Droid上,它甚至沒有試圖從任何提供商那裏找到一個位置,直到30秒過去。 – CaptainSpam 2010-06-10 20:07:10