【发布时间】:2011-07-02 18:02:35
【问题描述】:
除了设置和准确时间(即午夜)与设置延迟(即 24 小时)之外,使用AlarmManager 和ScheduledExecutorService 定期运行任务有什么区别?
就我而言,我需要运行一点代码来每晚检查新数据,并在有新数据时创建新通知。
谢谢!
【问题讨论】:
标签: android scheduling alarmmanager
除了设置和准确时间(即午夜)与设置延迟(即 24 小时)之外,使用AlarmManager 和ScheduledExecutorService 定期运行任务有什么区别?
就我而言,我需要运行一点代码来每晚检查新数据,并在有新数据时创建新通知。
谢谢!
【问题讨论】:
标签: android scheduling alarmmanager
ScheduledExecutorService 在您的应用程序进程中运行。如果应用程序进程终止,则不会运行任何计划任务。因此需要Service(因此您的流程超出了生命周期的活动活动部分)。
虽然AlarmManager 是始终运行的关键系统服务。如果您的应用程序安排了一些事情并被杀死,那么AlarmManager 可能会再次启动应用程序(通过PendingIntent)。
这里没有人提到的最后一个主要区别是AlarmManager 知道WakeLocks 和电源管理。这意味着AlarmManager 可能会在指定时间唤醒 Android 设备以运行计划任务。而ScheduledExecutorService 对电源管理一无所知,并且只会在设备未处于深度睡眠状态时启动任务(即它可能会错过时间)。
【讨论】:
ScheduledExecutorService 仅在您有一些组件(例如Service)一直在运行时才能工作。因此,它只应在组件因其他原因而在内存中的情况下使用,从而为用户增加价值。将组件存放在内存中只是为了观察时钟滴答作响是一种浪费,也是用户使用任务杀手等攻击开发人员的原因之一。
AlarmManager 是操作系统提供的系统服务。它可以在时间滚动时启动组件。因此,您不需要运行该组件。
就我而言,我需要运行一点代码来每晚检查新数据,并在有新数据时创建新通知。
这是AlarmManager 的明确方案。
【讨论】:
我认为ScheduledExecutorService 与您的进程相关联,并且在您的进程被杀死的情况下将无法工作。相比之下,AlarmManager 由操作系统管理,因此即使您的应用程序未运行,它也能正常工作。
【讨论】: