Besides setting and exact time (i.e. midnight) versus setting a delay (i.e. 24 hours), what's the difference between using AlarmManager
and ScheduledExecutorService
to run a task periodically?
In my case, I need to run a little bit of code to check for new data every night and create a new notification if there is new data.
Thanks!
I think
ScheduledExecutorService
is tied to your process and will not work in case your process gets killed. In contrastAlarmManager
is managed by the OS so it works even if your application is not running.ScheduledExecutorService
runs in your application process. If application process dies, none of the scheduled tasks will run. Hence the need forService
(so your process lives beyond Activities active part of lifecycle).While
AlarmManager
is critical system service that runs all the time. And if your application scheduled something and was killed, thenAlarmManager
may start application again (viaPendingIntent
).And the last major difference that no one mentioned here is that
AlarmManager
knows aboutWakeLock
s and power management. This means thatAlarmManager
may wake up Android device at specified time to run scheduled task. WhileScheduledExecutorService
knows nothing about power management and will only start task when device is not in deep sleep (i.e. it can simply miss the time).ScheduledExecutorService
will only work if you have some component, such as aService
, running all of the time. Hence, it should only be used in cases where the component would be in memory for other reasons, adding value to the user. Having a component be in memory solely to watch the clock tick by is wasteful and one of the reasons why users attack developers with task killers and such.AlarmManager
is an OS-supplied system service. It can start up a component when the time rolls around. Hence, you do not need to have the component running.This is a clear scenario for
AlarmManager
.