2

我使用日曆類,如下報警經理不觸發的確切時間報警android的

Calendar cal = Calendar.getInstance(); 
cal.set(Calendar.HOUR_OF_DAY,1); 
cal.getTimeInMillis(); 
cal.set(Calendar.MINUTE,05); 
long TriggerMillis = cal.getTimeInMillis(); 

AlarmManager aManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);  
aManager.set(AlarmManager.RTC_WAKEUP, TriggerMillis,pIntent); 

其中pIntent是一個懸而未決的意圖進一步進行時觸發報警時間安排的報警。

事件以幾秒鐘的延遲觸發。這是任何使用Calendar類進行此任務的問題。有什麼建議麼?

TIA ..

+0

什麼是'pIntent'?它是'BroadcastReceiver'的PendingIntent嗎? – CommonsWare

+1

您是否正在瞄準API級別19?如果是這樣,那就是設計。鬧鐘時間不準確。 –

+0

@CommonsWare pIntent是啓動服務的pendingIntent。 – Audhil

回答

10

你有兩個問題:

  1. 這是不可靠的使用_WAKEUP報警直接的服務。唯一可靠的模式涉及WakefulBroadcastReceiver,我的WakefulIntentService,或沿着這些線,PendingIntentBroadcastReceiver

  2. 如果您的android:targetSdkVersion爲19或更高,並且您在API Level 19+設備上運行,則set()是不精確的。理想情況下,您允許它是不精確的,或者使用setWindow()來控制它將如何關閉,以最小化警報事件的功率命中。如果絕對必須在某個精確時刻出現,則需要使用setExact()。由於setWindow()setExact()是API級別19的新增功能,因此您需要在較舊的設備上回退到set(),方法是檢查Build.VERSION.SDK_INT並相應地進行分支。

+0

是否可以在API 19+的準確時間安排重複的未來任務?當應用程序未在後臺運行且設備閒置時,我面臨問題。謝謝。 – Manmohan

+1

@Manmohan:不是。最接近的是你自己使用'setExact()'和「repeat」(通過再次調用'setExact()'作爲處理來自之前'setExact()'的工作的一部分)。但是,在Android 6.0+上,即使使用'setExactAndAllowWhileIdle()',這也不是很確切。 – CommonsWare

+0

這個建議奏效了!謝謝。 – Manmohan