2011-08-11 55 views
1

我設置了一個帶有RTC_WAKEUP標誌的鬧鐘,每30秒運行一次IntentService以將位置更新發送到服務器。我打算將該標誌更改爲RTC,以便在另一個進程喚醒手機時不會喚醒手機並運行。如果我離開LocationListener註冊,它會在手機睡着的時候仍然偵聽位置更新嗎?Android LocationListener在手機睡着時離開

回答

2

是 - 工作位置服務擁有自己的喚醒鎖。然而,更好的方法是在廣播接收器中手動設置適當的喚醒鎖定。請考慮一些優化 - 每30秒通過網絡發送數據將耗盡電池。

2

這裏有多個問題。

我設置了一個帶有標誌RTC_WAKEUP的警報,每30秒運行一次IntentService以將位置更新發送到服務器。

首先,您甚至可能在30秒內沒有獲得第一次修復,特別是在使用GPS時。你需要考慮到你可能會從得到一個修復(例如,用戶在一個地下位置)

二,請允許這個數字是用戶可配置的,包括一個選項「我會手動上傳數據」。正如@piotrpo指出的那樣,這是電池的重要消耗。事實上,如果你使用的是GPS,我懷疑電池能持續使用幾個小時。

第三,在這種情況下,IntentService將無法​​正常工作,因爲IntentService將在您的修復程序到達之前關閉。充其量,你會泄漏內存。最糟糕的是,你不會得到你的修復,因爲Android終止你的過程。

進行背景位置檢查的更好方案是使用常規Service而不是IntentService。常規服務將在onStartCommand()中註冊LocationListener,並且在不存在修復的情況下安排超時通知(例如,AlarmManagerset())。修復程序到達時,運行AsyncTask來完成上載。當AsyncTask完成時,或者如果超時到達並且您沒有得到修復,請取消註冊監聽器並呼叫stopSelf()關閉該服務。一路上,您將需要維護自己的WakeLock,以確保設備在所有這些都在進行時保持清醒狀態。

有關大多數(減去服務器上載部分)的示例,請參閱我的LocationPoller

如果你每30秒鐘左右發生一次死亡事件,那麼你完全可以根本不打擾AlarmManager。你將不得不有永久服務,永久運行,永久WakeLock和永久LocationListener。當修補程序到達onLocationChanged()時,如果修復程序距上一個修補程序超過30秒,請將其上載。而且,當您發佈應用程序時,請務必穿上阻燃服,因爲運行它的人可能不太喜歡這個結果。

+0

我不是問如何獲取位置檢查,我只是好奇,如果我離開了一個聽衆,並且手機睡着了,它還會被註冊嗎? – Hank

+0

不一定。 – CommonsWare

+0

不一定,這是什麼意思? – Hank

相關問題