2012-07-26 52 views
3

免責聲明:我的應用程序已經可以在沒有任何喚醒鎖的情況下運行1年以上,並且所有設備都適用於大多數設備。試圖瞭解我是否需要WakeLock

我跟蹤GPS和它的工作原理是這樣的:

  1. AlarmReceiver開始每5/10/15分鐘(如用戶意願)
  2. 服務認購位置更新和等待MAX 1分鐘服務良好的GPS。
  3. 總結,發送數據到服務器並關閉服務。

由於連接不良和位置不好,整個過程有時需要2-3分鐘。它的工作原理。不管電話是否在睡覺。

現在我正在閱讀WakeLock,它對我沒有意義。我的東西是如何工作的?這是巧合嗎?

+1

啊,是的,經典的問題。 「它有效,但是......它不應該?」 – climbage 2012-07-26 23:05:21

回答

1

我的東西是如何工作的?

事情的組合,包括運氣。 :-)

首先,正如Joel指出的那樣,設備會短暫地喚醒您的警報,但操作系統只能保證WakeLock的持續時間onReceive()BroadcastReceiver

至少在某些版本的Android上,請求GPS更新可能會導致操作系統獲得自己的WakeLock。這是AFAIK的無證行爲,我從來沒有依賴過它。但是,如果它確實如此,並且在刪除位置更新之前,您正在完成其餘的工作(「總結,發送數據到服務器並關閉服務」),這將解釋行爲。

您的方法仍然存在潛在的空白(例如,如果您委託Service進行工作,並且沒有將WakeLock作爲將控制權交給該服務的一部分)。從統計學上講,它可能會偶爾失敗,但需要花費很多時間。

就個人而言,我建議使用WakeLock,以防無證行爲發生變化。 That's what I do in LocationPoller

+0

嗯.. :)其實我在調用AsyncTask之前執行'removeUpdates'。但我確實訂閱了AsyncTask更新和完成的服務。大約需要5次HTTP調用,因此在調用removeUpdates之後至少需要5秒以上的時間。實際上,我希望你會回答,因爲我考慮切換到你的'WakefulIntentService',因爲它更多是我做的。 – katit 2012-07-27 00:52:30

+0

@katit:'WakefulIntentService'不適用於涉及工作的案例,它必須超越'doWakefulWork()例如從LocationManager異步接收位置。 「覺醒」屬性很好,但「IntentService」基礎不是。這就是爲什麼我將'LocationPoller'作爲同一個「清醒」概念的例子寫在另一種服務中的原因。 – CommonsWare 2012-07-27 10:30:03

0

那麼從AlarmManager文檔閱讀..

報警管理器,只要報警 接收機的onReceive()方法執行持有CPU喚醒鎖。

而且......

注:報警管理器適用於要具有在特定時間 您的應用程序代碼運行的情況下,即使你的應用程序 當前未運行。對於正常的定時操作(ticks, 超時等),使用Handler更容易,效率更高。

因此,基於此..我認爲它是有道理的,它目前的工作;如我錯了請糾正我。