2014-09-20 55 views
2

Android是否有精確的重複報警系統?

背景


我目前正在開發Android應用程序,它圍繞着一個用戶指定時間的鬧鐘。我的意圖是它將用於在早上醒來(和第二天早上 - 又名重複報警)。當鬧鐘進入時,它會呼叫一個 Activity,它有幾個選項(如貪睡)。我已經完成了所有這些工作,但我遇到了一個問題。


問題


我使用 AlarmManager來處理我的報警需求。然而,有一些好奇的課程(在我看來)正在進行。有兩種建議的方式來處理鬧鐘時間的設置。即, setInexactRepeatingsetRepeating。這些功能的問題是:

  • setInexactRepeating是不是很準確。我的測試顯示,這在指定的時間大致被激活,文檔指出,這一切都是相當模糊的;

    該警報在此時間之前不會觸發,但在第一次調用警報之前可能會有幾乎整個警報間隔的延遲。

    我的測試顯示通常有5分鐘的延遲。在this answer用戶的平均延遲時間約爲12分鐘。當然,這對於一個在特定時間喚醒人們的系統來說不會這樣。

  • setRepeating確實在指定的時間觸發。然而,文檔指出,從API 19開始,所有重複警報都是不精確的。這正是我不想要的。

    從API 19開始,所有重複的警報都是不精確的。由於此方法自API 3以來已可用,因此您的應用程序可以安全地調用它並確保它在當前版本和舊版本的Android上都會得到類似的行爲。

有一個setExact方法,但是這是一個有點過於具體。除此之外,它不會給我選擇有一定的時間間隔(用於每天重複報警)。 編輯:在嘗試使用setExact之後,我發現這將需要我升級到API 19(目前爲15),這是我想避免的。


問題


我使用了錯誤的類這個系統?對我來說,它似乎應該是一個合法的用法,但通過閱讀文檔讓我想知道。或許還有另一個更適合這個系統的課程?

+0

@MikeM。我的意思是這是一個可能有點矯枉過正的功能。浪費電池來使用它。你提到的警告讓我回想起setExact有點太過矯枉過正的感覺。我不希望應用程序在_exact_指定的時間持續運行。我不介意它是否會在30秒後發射(不是一分鐘)。我只是想知道我是否使用了正確的類,因爲非函數似乎很適合(我正在尋找一個inbetween函數)。也許我應該克服這種感覺並使用setExact;) – Bono 2014-09-20 15:18:02

+0

@MikeM。 Dang剛剛發現使用'setExact'需要我移動到API 19,這是我想避免的。是否真的沒有其他選擇使用這個類和/或它的功能? – Bono 2014-09-20 21:22:19

+1

@MikeM。學到了新東西。不知道你可以檢查不同的API級別並相應地改變你的方法。感謝:) – Bono 2014-09-20 21:37:02

回答

2

您可以在API 19之前和API 19之後分開。雖然是第一次設置報警:

  if (Build.VERSION.SDK_INT >= 19) { 
       alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), mondayIntent); 
      } else { 
       alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 
         AlarmManager.INTERVAL_DAY * 7, mondayIntent); 
      } 

當你趕上了警鐘:

if (Build.VERSION.SDK_INT >= 19) { 
     rescheduleAlarm(); 
    } 

您必須rescheduleAlarm

重新設定報警與

setexact 。

希望這會有所幫助。