在Android中使用AlarmManager启动每日服务?

3

我需要在每晚的午夜运行一个服务。我想使用AlarmManager来实现这个功能。

您能给我一些指导,如何使其正确地工作吗?

alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, System.currentTimeMillis(), AlarmManager.INTERNAL_DAY, serviceIntent);

也许我需要使用日历对象来指定时间?感谢任何帮助!
2个回答

6

setInexactRepeating(),顾名思义,是不精确的。请记住它可能会在午夜前后运行。

要确定午夜是什么时候,请使用Calendar对象。 然后调用getDate()方法获取一个Date对象,并在Date上调用getTime()方法以获取适当的毫秒值,用于您的setInexactRepeating()调用。


1
我需要它在午夜尽可能接近的时间运行,而不是在午夜之前。这样更合适吗? Calendar midnight = Calendar.getInstance(); midnight.set(Calendar.HOUR_OF_DAY,0); midnight.set(Calendar.MINUTE,0); midnight.set(Calendar.SECOND,0); midnight.set(Calendar.MILLISECOND,0); alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, midnight.getTimeInMillis(), AlarmManager.INTERVAL_DAY, serviceIntent); - Nate Radebaugh
“setRepeating()”比“setInexactRepeating()”更准确。即便如此,在设备同时进行其他操作时,仍然无法绝对保证您的闹钟代码控制的毫秒级定时时间。 - CommonsWare
好的,那么另一个问题..在DDMS中我一直看到“调度重新启动崩溃的服务...”这似乎阻止了我的服务被重复执行。有没有成功解决这个问题的方法,因为此时我的小部件停止按照我需要的方式更新? - Nate Radebaugh
这意味着您的服务崩溃了。之前应该有消息显示您出了问题的地方。 - CommonsWare
这意味着您的服务没有像应该那样关闭。AlarmManager 的目的是消除您的服务需要尝试永久运行(它无法做到)的需求。如果 Android 杀死了您的服务以释放内存,那就意味着服务仍在运行。我不认为这会对您的闹钟产生任何影响。 - CommonsWare
显示剩余3条评论

0
如果你想让你的代码在午夜特定时间运行,不要使用"setInexactRepeating"。实际上,你需要使用alarmManager.setRepeating(RTC_WAKEUP, ...),然后使用Calendar计算下一个你想要运行的午夜时间。
如果你需要在午夜唤醒取决于用户活动,以至于没有必要精确地在午夜唤醒手机,只需在用户在午夜后使用手机时首先运行该操作,你可以将RTC_WAKEUP更改为RTC。虽然,使用RTC_WAKEUP在午夜准确唤醒的电池效果应该是微不足道的,所以最简单的方法可能就是强制唤醒。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接