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