2016-02-02 41 views
0

我的應用程序有一個AlarmManager設置爲每60秒觸發一次。它會觸發一個片段,檢查當前時間並查看應用程序日曆中是否有當前發生的事件。 它運行的很好,直到我發現它跳過其中一個事件。爲了檢查應用程序的完整性,我讓片段將當前時間(分鐘0-59)寫入文本文件,並查看它是否跳過任何​​內容。仔細查看連續三天錄製的文件後,我發現它確實存在。AlarmMamanger不準確

47,48,50,50,51,52,54,54,55,56,57,58,59,0,1,2,

這發生隨機的任何地方。它發生在3-4小時後。下面是另一個示例

1,1,3,4,5,6,7,7,9,9,10,11,12,13,

的AlarmManager代碼不具有任何問題似乎。儘管如果代碼在給定時間過去之前跳過了一分鐘或者觸發,那麼在某處出現了問題。 這裏是我使用的AlarmManager

long alertTime = new GregorianCalendar().getTimeInMillis(); 

    int timeInterval = 60*1000; 

    Intent alertIntent = new Intent(this, AlertRec.class); 

    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 

    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, alertTime, timeInterval, PendingIntent.getBroadcast(this, 1, alertIntent, PendingIntent.FLAG_UPDATE_CURRENT)); 

問題的代碼: 1)爲什麼AlarmManager作用不規則? 2)如何避免這種情況?

我可以減少間隔時間來解決這個問題嗎?我讀了60是你需要申請的最小時間間隔。

+1

** 1 ** - 因爲您正在瞄準API級別19+。 ** 2 ** - 通過定位API級別18或根據操作系統版本使用不同的方法來設置PendingIntent/s。請查看[官方文檔](http://developer.android.com/reference/android/app/AlarmManager.html)。 –

回答

2

根據文檔這裏:http://developer.android.com/reference/android/app/AlarmManager.html

與API開始19(KITKAT)報警輸送是不精確的:操作系統將爲了 移警報,以儘量減少喚醒和電池使用。有 新的API支持需要嚴格交付 保證的應用程序;請參閱setWindow(int,long,long,PendingIntent)和setExact(int,long,PendingIntent)。其中 targetSdkVersion早於API 19的應用程序將繼續看到 之前的行爲,在該行爲中, 請求時所有報警均準確傳送。

這很好解釋了它的大部分。此外,據我所知,他們在內部增加了重複警報的最短時間限制〜1分鐘,因此減少間隔可能不是最好的主意。

希望這會有所幫助!