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