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

标签 android android-service alarmmanager android-alarms

服务始终可以由操作系统关闭。因此,对我来说,它们似乎不如 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() 返回,警报管理器就会释放此唤醒锁。这意味着在某些情况下,一旦 onReceive() 方法完成,手机就会进入休眠状态。如果您的警报接收器调用 Context.startService(),则手机可能会在启动请求的服务之前休眠。为了防止这种情况,您的广播接收器和服务将需要实现单独的唤醒锁定策略,以确保手机继续运行,直到服务可用。

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

计时器

计时器 = 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

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

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

来源:Scheduling recurring task in Android

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

相关文章:

android - 如何确定 Android Studio 是否实际使用了英特尔 HAXM 加速器?

android - 如何垂直居中 toast 并显示在屏幕底部

android - LinkedIn 集成 Android 移动 SDK 电子邮件 ID 未获取

android - 如何在打瞌睡模式下持续激活互联网棉花糖和牛轧糖

android - 即使在打瞌睡模式下也每 15 秒获取一次位置

java - 为什么这不能形成一个好看的正方形?

java - 使用服务内的广播接收器检测调用结束

android - 禁用电池百分比更新

android - 如何判断 Android 重复闹钟的年龄?

android - 警报管理器设置重复不等到时间关闭