【问题标题】:Alarm manager not triggering alarms at exact time in android警报管理器不会在android中的确切时间触发警报
【发布时间】:2014-01-25 19:42:05
【问题描述】:

我使用日历类安排闹钟如下

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

【问题讨论】:

  • 什么是pIntent? PendingIntent 是 BroadcastReceiver 吗?
  • 您的目标是 API 级别 19 吗?如果是这样,那是设计使然。闹钟时间不准确。
  • @CommonsWare pIntent 是一个用于启动服务的pendingIntent。
  • @Tobor 是的,我的目标是 API 级别 19。还有其他方法可以解决这个问题吗?

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


【解决方案1】:

你有两个问题:

  1. 直接将_WAKEUP 警报与服务一起使用是不可靠的。唯一可靠的模式涉及WakefulBroadcastReceiver、我的WakefulIntentService 或类似的东西,其中PendingIntent 将是BroadcastReceiver。

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

【讨论】:

  • 是否可以在 API 19+ 的确切时间安排重复的未来任务?当应用程序未在后台运行且设备空闲时,我面临问题。谢谢。
  • @Manmohan:不是这样。您最接近的方法是使用setExact() 并自己“重复”(通过再次调用setExact() 作为处理早期setExact() 工作的一部分)。但是,在 Android 6.0+ 上,即使使用 setExactAndAllowWhileIdle(),这也不是很准确。
【解决方案2】:

我认为你应该使用该功能

setExactAndAllowWhileIdle

例如:

AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
manager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis() + 100, pendingIntent); // +100 is to set nearly to the current time

你必须知道这不是一个重复的闹钟,所以在你的 BroadcastReceiver 结束时你应该设置下一个闹钟。

问候

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多