我不确定,但据我所知,我分享我的观点。如果我错了,我总是接受最佳答案。
报警管理器
只要警报接收器处于唤醒状态,警报管理器就会保持 CPU 唤醒锁定。onReceive()
方法正在执行。这保证了在您处理完广播之前手机不会休眠。一次onReceive()
返回后,警报管理器释放此唤醒锁。这意味着在某些情况下,一旦您的手机进入睡眠状态,手机就会进入睡眠状态。onReceive()
方法完成。如果您的报警接收器打来电话Context.startService()
,手机可能会在请求的服务启动之前休眠。为了防止这种情况发生,您的BroadcastReceiver
and Service
将需要实施单独的唤醒锁定策略,以确保手机继续运行,直到服务可用。
注意:警报管理器适用于您希望应用程序代码在特定时间运行的情况,即使您的应用程序当前未运行也是如此。对于正常的计时操作(滴答声、超时等),使用 Handler 更容易、更高效。
Timer
timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
synchronized public void run() {
\\ here your todo;
}
}, TimeUnit.MINUTES.toMillis(1), TimeUnit.MINUTES.toMillis(1));
Timer
有一些缺点可以通过以下方式解决ScheduledThreadPoolExecutor
。所以这不是最好的选择
调度线程池执行器.
您可以使用java.util.Timer
or ScheduledThreadPoolExecutor
(首选)安排在后台线程上定期发生的操作。
这是使用后者的示例:
ScheduledExecutorService scheduler =
Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate
(new Runnable() {
public void run() {
// call service
}
}, 0, 10, TimeUnit.MINUTES);
所以我更喜欢ScheduledExecutorService
但还要考虑一下,如果更新将在您的应用程序运行时发生,您可以使用Timer
,如其他答案中所建议的,或较新的ScheduledThreadPoolExecutor
。
如果您的应用程序即使未运行也会更新,您应该选择AlarmManager
.
警报管理器适用于您希望应用程序代码在特定时间运行的情况,即使您的应用程序当前未运行也是如此。
请注意,如果您计划在应用程序关闭时进行更新,那么每十分钟更新一次就相当频繁了,因此可能有点太耗电了。