如何设置重复发生的AlarmManager每天执行代码

我目前正在尝试写报警pipe理器,每天在指定的时间内发出报警。 首先,我检查用户是否为那天设置了闹钟:

if ((User.getReminderTime(Home.this) > 0) && (dt.getDate() != today.getDate() || dt.getDay() != today .getDay())) { AppointmentManager.setFutureAppointmentCheck(this .getApplicationContext()); User.setLongSetting(this, "futureappts", today.getTime()); } 

然后我去设置实际的闹铃,在第二天的12点到12点10分之间熄灭:

  public static void setFutureAppointmentCheck(Context con) { AlarmManager am = (AlarmManager) con .getSystemService(Context.ALARM_SERVICE); Date futureDate = new Date(new Date().getTime() + 86400000); Random generator = new Random(); futureDate.setHours(0); futureDate.setMinutes(generator.nextInt(10)); futureDate.setSeconds(0); Intent intent = new Intent(con, FutureAppointmentReciever.class); PendingIntent sender = PendingIntent.getBroadcast(con, 0, intent, PendingIntent.FLAG_ONE_SHOT); am.set(AlarmManager.RTC_WAKEUP, futureDate.getTime(), sender); } 

现在我设置了一个testing环境,每隔两分钟就closures一次,似乎工作正常,但是当我部署到实际的设备时,接收器似乎并没有收到警报。 我认为这可能是一个设备睡着了,所以我添加了电源pipe理器的问题。 但它仍然不起作用:

  PowerManager pm = (PowerManager) context .getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wl = pm.newWakeLock( PowerManager.PARTIAL_WAKE_LOCK, "keepAlive"); wl.acquire(); setFutureAppointments(context.getApplicationContext()); AppointmentManager.setFutureAppointmentCheck(context .getApplicationContext()); User.setLongSetting(context.getApplicationContext(), "futureappts", new Date().getTime()); wl.release(); 

任何人看到我正在做的公然错误,或者我不正确地做这个? 感谢任何和所有的帮助。

Related of "如何设置重复发生的AlarmManager每天执行代码"

我通常会做更多的事情:

 Intent i = new Intent(this, MyService.class); PendingIntent pi = PendingIntent.getService(this, 0, i, 0); AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); am.cancel(pi); // cancel any existing alarms am.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + AlarmManager.INTERVAL_DAY, AlarmManager.INTERVAL_DAY, pi); 

这样,您不必担心在您的Service重新设置AlarmManager

我通常在我的应用程序启动时( onResume在我的主要活动中)以及设置为接收BOOT_COMPLETEDBroadcastReceiver中运行这段代码。

我已经写了一篇关于创buildService和使用AlarmManager ,这是基于我自己的经验以及从观看Google I / O谈话中摘取的一些提示和技巧。 如果你有兴趣,你可以在这里阅读。


为了回答你的问题,我只能引用文档 :

 public void setInexactRepeating (int type, long triggerAtTime, long interval, PendingIntent operation) 

安排具有不精确的触发时间要求的重复报警; 例如,每小时重复一次,但不一定每小时重复一次。 这些报警比由setRepeating(int,long,long,PendingIntent)提供的严格的重现更为省电,因为系统可以调整报警的相位,使其同时触发,避免超过必要的唤醒设备。

您的警报的第一个触发器将不会在请求的时间之前,但在此之后的几乎整个时间间隔内可能不会发生。 另外,当重复报警的整个周期将按照要求进行时,报警的两次连续发射之间的时间可能会有所不同。 如果您的应用程序要求非常低的抖动,请改用setRepeating(int,long,long,PendingIntent)。

总之,这不是很清楚。 文档只是说,警报“可能会有所不同”。 但是,重要的是要知道,在此之后的几乎整个时间间隔内,第一个触发器可能不会发生

这是工作,这将每隔5秒后发出警报

 private void setRecurringAlarm() { Logger.d(IConstants.DEBUGTAG, "Setting Recurring Alarm"); Calendar updateTime = Calendar.getInstance(); updateTime.set(Calendar.SECOND, 5); Intent alarmIntent = new Intent(this, AlarmReceiver.class); PendingIntent recurringDownload = PendingIntent.getBroadcast(this, 0, alarmIntent, PendingIntent.FLAG_CANCEL_CURRENT); AlarmManager alarms = (AlarmManager) getSystemService(Context.ALARM_SERVICE); alarms.cancel(recurringDownload); alarms.setInexactRepeating(AlarmManager.RTC_WAKEUP, updateTime.getTimeInMillis(), 1000 * 5, recurringDownload); //will run it after every 5 seconds. }