目前我有一个可以发送通知的应用程序,我希望这个应用程序能够每 x 分钟自动发送这些通知(例如,默认值为 15 分钟)。应发送此通知时,应用程序当前可能正在运行,也可能未运行。
经过一番阅读,我确定将在这里使用 AlarmManager,但我不知道如何从中调用方法。我已经有了通知代码,我只需要每 x 分钟调用一次。
我对此很陌生,这是我的第一个练习应用程序(有 C# 经验,但在 Java 方面很少)。
谢谢,大卫。
目前我有一个可以发送通知的应用程序,我希望这个应用程序能够每 x 分钟自动发送这些通知(例如,默认值为 15 分钟)。应发送此通知时,应用程序当前可能正在运行,也可能未运行。
经过一番阅读,我确定将在这里使用 AlarmManager,但我不知道如何从中调用方法。我已经有了通知代码,我只需要每 x 分钟调用一次。
我对此很陌生,这是我的第一个练习应用程序(有 C# 经验,但在 Java 方面很少)。
谢谢,大卫。
您可能需要考虑这样的事情:
Intent intent = new Intent(this, MyService.class);
PendingIntent pintent = PendingIntent.getService(this, 0, intent, 0);
AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
// Start every 30 seconds
alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 30*1000, pintent);
如果您不清楚,请阅读本 教程
写一个IntentService
。在其中,只需启动一个新的Thread
. 在中Thread.run()
,放置一个无限的while循环来调用您的通知代码和Thread.sleep(15 * 60 * 1000)
....
如果您想以指定的时间间隔安排任务,请不要使用标志AlarmManager.RTC
和AlarmManager.RTC_WAKEUP
方法alarm.setRepeating(...)
。因为在这种情况下,警报将绑定到设备的实时时钟。因此更改系统时间可能会导致警报行为异常。您必须使用标志AlarmManager.ELAPSED_REALTIME
或AlarmManager.ELAPSED_REALTIME_WAKEUP
. 在这种情况下SystemClock.elapsedRealtime()
,将作为调度警报的基础。
代码将如下所示:
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + checkIntervalMillis, checkIntervalMillis, pendingIntent);
如果您希望在设备处于睡眠模式时执行长时间运行的任务,我建议使用 CommonsWare 的 WakefulIntentService 库:https ://github.com/commonsguy/cwac-wakeful