gpt4 book ai didi

android - AlarmManager 而不是后台服务?对于重复的任务

转载 作者:行者123 更新时间:2023-11-30 01:52:19 25 4
gpt4 key购买 nike

服务总是可以被操作系统关闭。因此,它们对我来说似乎不如 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 秒检查一次,就可以保证在用户使用其他应用程序时它会一直存在。但如果报警管理器,我能保证检查总是正确的吗?

最佳答案

我不确定,但据我所知,我分享我的观点。如果我错了,我总是接受最佳答案。

报警管理器

只要警报接收器的 onReceive() 方法正在执行,警报管理器就会持有 CPU 唤醒锁。这保证了在您处理完广播之前手机不会休眠。一旦 onReceive() 返回,Alarm Manager 释放这个唤醒锁。这意味着手机在某些情况下会在您的 onReceive() 方法完成后立即休眠。如果您的警报接收器调用了 Context.startService(),则电话可能会在请求的服务启动之前进入休眠状态。为防止这种情况,您的 BroadcastReceiver 和服务将需要实现单独的唤醒锁定策略,以确保手机继续运行直到服务可用。

注意:警报管理器适用于您希望在特定时间运行应用程序代码的情况,即使您的应用程序当前未运行。对于正常的计时操作(滴答、超时等),使用 Handler 更容易、更高效。

计时器

定时器 = 新定时器();

timer.scheduleAtFixedRate(new TimerTask() {

synchronized public void run() {

\\ here your todo;
}

}}, 60000, 60000);

Timer 有一些缺点,已被 ScheduledThreadPoolExecutor 解决。所以这不是最好的选择

调度线程池执行器。

您可以使用 java.util.Timer 或 ScheduledThreadPoolExecutor(首选)安排一个 Action 在后台线程上定期发生。

这是使用后者的示例:

ScheduledExecutorService scheduler =
Executors.newSingleThreadScheduledExecutor();

scheduler.scheduleAtFixedRate
(new Runnable() {
public void run() {
// call service
}
}, 0, 10, TimeUnit.MINUTES);

所以我更喜欢ScheduledExecutorService

但是还要考虑一下,如果更新将在您的应用程序运行时发生,您可以使用定时器,如其他答案中所建议的,或更新的 ScheduledThreadPoolExecutor。如果您的应用程序即使在未运行时也会更新,您应该使用 AlarmManager。

警报管理器适用于您希望在特定时间运行应用程序代码的情况,即使您的应用程序当前未运行。请注意,如果您计划在关闭应用程序时进行更新,则每十分钟一次的频率非常高,因此可能有点太耗电了。

来源:Scheduling recurring task in Android

关于android - AlarmManager 而不是后台服务?对于重复的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32835457/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com