操作系统始终可以关闭服务。因此,它们对我来说似乎不如AlarmManager。我必须每1-2秒定期更新一次。在服务或AlarmManager中使用后台线程是否更好?由于有方法可以在不唤醒应用程序的情况下使用AlarmManager。见http://vikinghammer.com/2012/04/22/android-use-alarmmanager-instead-of-a-service-with-a-timertask/
我想知道Timer,Thread和Service代码有什么优势?我认为我对AlarmManager的一个想法是任务代码必须在某处执行,因此在接收到它时,BroadcastReceiver似乎是执行代码的错误位置。如何传递给IntentService?这比开始运行的后台服务中的所有线程管理的开销更高吗?如果没有AlarmManager,我们如何保证后台服务真正保持正常运行?
为了澄清,我的应用程序将在后台运行,而其他应用程序可以由用户运行。我会阻止他们中的一些,但让别人跑很长时间。因此,我不认为每2秒进行一次服务检查,保证在用户与其他应用程序交互时保持服务。但是如果报警经理,我可以保证检查总是做对吗?
答案 0 :(得分:1)
我不确定,但据我所知,我赞同我的观点。如果我错了,我总是接受最好的答案。
警报管理器
只要警报接收器的onReceive()方法正在执行,警报管理器就会保持CPU唤醒锁定。这可以保证在您完成广播处理之后手机不会睡眠。一旦onReceive()返回,Alarm Manager就会释放此唤醒锁定。这意味着在某些情况下,只要onReceive()方法完成,手机就会休眠。如果您的警报接收器调用了Context.startService(),则手机可能会在启动所请求的服务之前休眠。为了防止这种情况,您的BroadcastReceiver和服务需要实施单独的唤醒锁定策略,以确保手机继续运行,直到服务可用。
注意:警报管理器适用于您希望在特定时间运行应用程序代码的情况,即使您的应用程序当前未运行也是如此。对于正常的计时操作(刻度,超时等),使用Handler会更容易,也更有效。
定时器
timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
synchronized public void run() {
\\ here your todo;
}
}}, 60000, 60000);
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
但是请注意,如果在应用程序运行时进行更新,您可以使用其他答案中建议的Timer或更新的ScheduledThreadPoolExecutor。如果您的应用程序即使在未运行时也会更新,您应该使用AlarmManager。
警报管理器适用于您希望在特定时间运行应用程序代码的情况,即使您的应用程序当前未运行也是如此。 请注意,如果您计划在应用程序关闭时进行更新,则每十分钟一次是非常频繁的,因此可能有点过于耗电。