警报管理器在android中没有在准确的时间触发警报

时间:2014-01-25 19:42:05

标签: android calendar alarmmanager android-pendingintent android-alarms

我使用Calendar类安排闹钟,如下所示

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 ..

1 个答案:

答案 0 :(得分:10)

您有两个问题:

  1. 直接对服务使用_WAKEUP警报是不可靠的。唯一可靠的模式包括WakefulBroadcastReceiver,我的WakefulIntentService或其他内容,其中PendingIntent将是BroadcastReceiver

  2. 如果您的android:targetSdkVersion为19或更高,并且您使用的是API级别19以上的设备,则set()不准确。理想情况下,您允许它不精确,或者可能使用setWindow()来控制它的关闭程度,以最大限度地降低警报事件的功率。如果绝对必须在精确时刻发生,则需要使用setExact()。由于setWindow()setExact()是API级别19的新用户,因此您需要通过检查set()并相应地进行分支,在旧设备上回退到Build.VERSION.SDK_INT