2012-11-02 80 views
2

如何在準確的時間間隔使用報警管理器?報警管理器準確度

我使用了報警管理器,但它的響應不準確。 任何人都可以幫助我嗎? 我用這個代碼

PendingIntent sender; 
AlarmManager am; 
long firstTime; 
Intent itnt = new Intent(); 
itnt.setAction("abts.medismo.medismo.ALARMRECEIVER"); 
sender = PendingIntent.getBroadcast(context, 0,itnt, 0); 
am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
am.cancel(sender); 
firstTime = SystemClock.elapsedRealtime(); 
am.setInExactRepeating(AlarmManager.ELAPSED_REALTIME,firstTime, Integer.parseInt(sep[3]), sender); 

回答

2

你應該使用ELAPSED_REALTIME_WAKEUP,因爲如果手機是睡着了,它不會火,直到它再次醒來。

0

我相信您觀察到的不準確可能是由警報標誌的細微變化引起的。

AlarmManager.ELAPSED_REALTIMEAlarmManager.ELAPSED_REALTIME_WAKEUP利用elapsedRealtime(),這是自設備上次啓動以來的毫秒數,適用於測量定時器等的經過時間。

AlarmManager.RTCAlarmManager.RTC_WAKEUPcurrentTimeMillis()利用,這是系統時鐘:

以毫秒爲單位的時間,因爲1970 00:00:00 UTC 1月1日。此方法不應用於測量超時或其他經過時間的測量,因爲更改系統時間可能會影響結果。

我列出了包括時間在睡眠中度過,但只有*_WAKEUP標誌將喚醒設備發出警報的AlarmManager時鐘標誌的所有四個;默認標誌將一直等到設備被喚醒,然後立即發出警報。

確保您選擇與您的用例相匹配的標誌,並確保您的延遲值{在sep[3]?}是警報之間以毫秒爲單位等待的時間量;如你所知,你的Integer正在拆箱並投入很長時間;它的工作原理,但除非有它的原因,我建議切換到原始long;所以有15分鐘的延遲將是:

int delay = 900000L // 15 minutes * 60 seconds * 1000 milliseconds 

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

http://developer.android.com/reference/android/os/SystemClock.html

0

有兩個問題在這裏。

第一,正如其他人指出的,你的報警不是「喚醒」警報。這意味着如果在達到觸發時間時設備處於睡眠狀態,則警報不會立即喚醒設備並處理警報。相反,只要有其他事件導致設備變爲活動狀態,就會對其進行處理,例如用戶拿起設備並按下電源按鈕開始使用設備。

第二個問題是您正在使用setInexactRepeating()。顧名思義,這些警報絕不會在準確可預測的時間內提供。正如文件所述,「此外,雖然重複報警的整個週期將按照要求進行,但報警的兩次連續發射之間的時間可能會有所不同。」

這對大多數應用程序來說已經足夠了,而且在電池使用方面效率更高。但是,如果確實需要在特定時間發送警報,則需要自己設置警報時間,而不是依賴定期警報。另外,從API版本19開始,如果您確實需要精確交付,則應使用新的setExact() API。