2013-07-19 34 views
4

我有一個應用程序應該定期運行後臺服務,我正在使用AlarmManager來實現這種行爲。長話短說,它設置爲每分鐘運行兩次(每30秒),大約需要20秒才能執行(主要是睡眠)。Android AlarmManager有時會遲到

我正在使用多個Android設備進行測試(Galaxy 4.2與4.1.2,Nexus 4與4.2.2和更高版本,CyanogenMOD 10.1.2和Nexus 7與4.2.2),並且所有這些設備在連接時表現一致USB和調試器。

一旦我拔下設備並將其放在桌面上,我注意到有時候服務將會錯過一個間隔。仔細查看日誌,我發現服務有時會延遲一段時間。如果它應該在xx:05和xx:35運行,我會注意到它在xx:45開始(比它應該晚10秒)。

服務所做的第一件事就是獲取部分喚醒鎖,以確保CPU在運行時不會進入休眠狀態 - 這個喚醒鎖只有完全按照它應該做的那樣才能釋放。

我的第一個想法是,這是導致行爲的一些共享資源爭用(還有其他進程與應用程序一起運行),但該服務甚至沒有啓動,它甚至沒有獲得喚醒鎖,直到某些10秒後。

值得一提的是,這種行爲在Nexus 4上最爲突出,其中多達30%的數據丟失,而Galaxy SII和Nexus 7上的數據量大幅減少(約爲2%),但它仍然是一個值得關注的問題。這是無法解釋的行爲。

回答

3

你沒有說明你正在使用什麼類型的警報,但是鑑於你的投訴,我認爲這是一個_WAKEUP報警。如果是這樣,只有保證我們有,如果我們使用廣播PendingIntent,Android會在撥打電話onReceive()期間保持設備清醒。使用服務PendingIntent如您所做的那樣不可靠,因爲設備在服務啓動之前可能會重新入睡並且可能獲得WakeLock

因此,對於_WAKEUP報警更可靠的方式是使用廣播PendingIntent,有BroadcastReceiveracquire()WakeLock,然後把它稱之爲startService()來控制傳遞給您的服務。您的服務完成其工作,然後發佈WakeLock

我有這種模式包裝在my WakefulIntentService component

+0

謝謝你的回覆。看起來,您所描述的概念提高了Nexus 4的可靠性,其可靠性與Galaxy S2相當 - 但仍然有一個「數據包」顯然缺失(自從我做出更改以來,它已經超過了500個) )。不幸的是,該日誌在該事件發生後被截斷,所以我不能確切地看到發生了什麼。 – Iv4n

+1

我將此答案標記爲已接受,因爲所包含的信息提高了定時服務的可靠性。仍然有0.2%的下降率,我還不能解釋。 – Iv4n