2012-12-28 54 views
1

我需要在我的應用程序中進行背景檢查,基本上輪詢各種URL以查找新東西。所以我讀過這個是用AlarmManager完成的。Android:無需耗盡電池即可使用AlarmManager的正確方法

事情是,我不需要在新東西到達時通知用戶。假設我正在檢查每個小時,在手機處於睡眠狀態時沒有做任何檢查,我完全沒問題,並且在使用手機時恢復檢查。這樣用戶最終得到通知,但排水量很小。

所以我試着用setInExactRepeating。我在啓動時啓動它,但也在應用程序啓動(主要是安裝後的會話,並確保它即使應用程序被「強行殺死」也運行)。我如何防止所有這些檢查加起來? (只有在沒有運行的情況下才能運行新的檢查,或者需要停止前一個檢查)。

+0

假設您可以順序運行這些測試,請使用一個可以運行所有檢查的「Intent」。 –

回答

7

我發現setInexact重複加上ELAPSED_REALTIME(或RTC)相當,實現非常小的電池消耗。在現有的pendingintent(相同的intent和id)上使用FLAG_UPDATE_CURRENT標誌只會刷新當前的警報時間表(如果它已經存在)。或者,添加Ralgha建議的代碼以檢查並確定您是否已創建掛起的意圖並設置警報,如果沒有,則設置掛起的意圖和警報時間表。這兩種方法都可能對電池產生相同的影響(可忽略不計)。什麼會造成重大的流失,是經常進行一些事情。您只需要每小時更新一次,而不是當屏幕關閉時,您的應用幾乎沒有使用任何的電池(假設它與它的處理相對迅速地完成,並很好地後自己清理)的事實

http://developer.android.com/reference/android/app/AlarmManager.html#ELAPSED_REALTIME

ELAPSED_REALTIME

此報警不會喚醒設備;如果它在設備睡着的時候熄滅,它將不會在設備下一次喚醒之前交付。

http://developer.android.com/reference/android/app/AlarmManager.html#setInexactRepeating%28int,%20long,%20long,%20android.app.PendingIntent%29

setInexactRepeating

這些報警比(INT,很久,的PendingIntent)由setRepeating供給的嚴格復發更節能,因爲該系統可以調整告警相使它們同時閃光,避免超出必要的睡眠狀態喚醒設備。

http://developer.android.com/reference/android/app/PendingIntent.html#FLAG_UPDATE_CURRENT

FLAG_UPDATE_CURRENT

...如果所描述的PendingIntent已經存在,則保留它,但它與什麼是在這個新的意圖替換其額外數據。如果你正在創建只有額外變化的意圖,可以使用它,並且不關心任何接收你以前的PendingIntent的實體將能夠使用你的新的額外功能啓動它,即使它們沒有被明確地賦予它。

1

您可以在設置之前查看是否已經設置了鬧鐘,並且您還可以使用標誌,以便在設備醒來之前不會傳送鬧鐘。

 
if (PendingIntent.getBroadcast(context, 0, updateIntent, PendingIntent.FLAG_NO_CREATE) == null) 
{ 
    pendingIntent = PendingIntent.getBroadcast(context, 0, updateIntent, 0); 
    getSystemService(ALARM_SERVICE).setInexactRepeating(AlarmManager.RTC, System.currentTimeMillis(), AlarmManager.INTERVAL_HOUR, pendingIntent); 
} 
+0

謝謝,但「updateIntent」是指什麼? – erwan

+0

這就是要啓動您的服務進行更新的意圖。 – Ralgha

+0

@erwan我懷疑你會看到很多電池消耗差異檢查,看看你是否已經創建了PI並且已經設置了警報,而不是僅僅在oncreate時用PI上的FLAG_UPDATE_CURRENT設置不重複的重複(假設你正在使用服務)。 – logray