2012-01-20 81 views
3

我需要實施基於位置的服務。我不需要很好的位置,所以不需要GPS。位置提供商真的是電池消耗?

最簡單的將是開始監聽在應用程序啓動位置更新,並把它留在:

mLocationMgr.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10000, 100, mPendingIntent); 

因爲我並不需要太多的準確性,我設置的更新頻率最高,爲10秒,和100米而不是默認的0,0.

當我們認爲位置,我們認爲電池耗盡,但我想這是一個捷徑,只有GPS真正耗盡電池。我認爲網絡提供商的這種使用不會耗盡電池。有什麼想法嗎?

+1

那麼你可以隨時寫測試。以兩種方式壓縮基於位置的服務,每個服務一小時。然後看看每個電池的電量是多少。 – JPM

+0

我沒有任何統計數據來備份我對此的看法。所以拿它的價值來說吧。但我認爲是的,儘管它不會像電池使用時那樣耗費大量電池,並且有時間,而接近度設置爲最低。與完全沒有這樣做相比,它仍然是電池的顯着消耗。我的經驗純粹從用戶的角度來看,我沒有創造任何利用它的東西。偉大的建議JPM,如果你打算這樣做,檢查市場上的應用程序「電池圖」。對於這種類型的測試來說是完美的。 – FoamyGuy

回答

6

從電池放電的角度來看,您的100米距離過濾器對您幾乎沒有任何作用。這隻會控制您的PendingIntent由於修復而被執行多少次。

您的10秒時間值可能是被操作系統用來控制用電量,但不能保證。而且,在這樣低的價值下,它似乎不太可能被使用。每個小時,也許,但不是每10秒。

更重要的是,您將需要始終保持CPU處於開機狀態。而且,由於您使用的是requestLocationUpdates()PendingIntent,所以我猜測您計劃長時間收集數據。

如果您只有COARSE權限,Android有望避開WiFi熱點接近度檢測,這將節省一些電量。總體而言,網絡提供商將比GPS提供商消耗更少的功率。 「少」與「小」相差甚遠。在Nexus級Android設備上,GPS + CPU給我幾個小時的電池使用時間(根據使用Google導航確定)。我希望網絡提供商+ CPU的使用時間可以延長几個小時,但這只是一個問題,因爲CPU本身就是一個相當大的電池消耗。

我更大的擔憂是:

最簡單的將是開始監聽在應用程序啓動位置更新,並把它留在

這聽起來像是你是不是真正的刪除計劃你的位置更新。這是一個非常糟糕的主意,任何類型的提供者(除了或許是被動提供者)。當你註冊並刪除更新時,請有一個更具體的計劃。特別是,確保用戶有能力控制何時消耗電池達到此程度。

7

Android Developers Guide中包含一個關於此的主題。我建議你看一下頁面上的代碼示例。

這是他們提到的關於節約電池和各種參數。

調整模式以節省電池和數據交換

當你測試你的應用程序,你可能會發現,你的 提供良好的地理位置和良好的性能模型需要一些調整。 以下是您可能需要更改的一些事項,以便在兩者之間找到一個很好的平衡點 。減小窗口的大小

您在偵聽位置更新的較小窗口意味着較少的與GPS和網絡位置服務的互動,因此保留了電池壽命 。但它也允許更少的地點從中選擇最佳估計值。設置位置提供商以返回更新 不太頻繁

降低窗口期間出現新更新的速率 也會提高電池效率,但會以犧牲準確性爲代價。取捨的價值取決於您的應用程序的使用方式。您 可以通過增加requestLocationUpdates()中的參數來減少更新速率,該參數指定間隔時間和最小距離更改。限制一組提供商

取決於在使用你的應用環境或精度 期望的水平,你可以選擇只使用網絡 位置提供者或只有GPS,而不是兩個。僅與 互動,其中一項服務可降低電池使用量,其潛在成本精度爲 。

基本上,考慮減少您請求的更新頻率或請求它們的時間長度。這就像高爾夫,你要求的位置越少越好。考慮以下用例: An example of location based content tagging

在該示例中,應用程序將等待用戶執行需要位置的操作,然後在不再需要位置數據時停止輪詢。

雖然不斷輪詢可以讓應用程序在即時通知的位置準備就緒,但它不值得浪費資源,爲了減輕請求位置時的延遲,您可以使用getLastKnownLocation (String provider)

編輯: 有一種方法可以確定各種LocationProviders的用電量!

在LocationProvider上調用getPowerRequirement()return one of three constants

int  POWER_HIGH A constant indicating a high power requirement. 
int  POWER_LOW A constant indicating a low power requirement. 
int  POWER_MEDIUM A constant indicating a medium power requirement. 

爲了使您的代碼更易讀的外觀到任何布爾檢查使用meetsCriteria (Criteria criteria)使你的代碼更易讀。

我會用它來確定您的應用程序應該使用哪種方法以獲得最低的功耗成本,同時您也有支持對提供程序具有不同功率要求的設備的好處。

+1

是的,我在發佈stackoverflow之前已經閱讀了這整個教程:-)。我擔心的是,他們在電池耗盡時沒有區分GPS和網絡位置提供商。 – muslidrikk

+1

我將最後一條評論寫入答案,請參閱底部的編輯並讓我知道它是否回答您的問題。 –

+0

聽起來像是一個很好的提示來檢查電源要求! – muslidrikk