Разница между AlarmManager и ScheduledExecutorService - PullRequest
14 голосов
/ 02 июля 2011

Помимо установки и точного времени (то есть полуночи) по сравнению с установкой задержки (то есть 24 часа), в чем разница между использованием AlarmManager и ScheduledExecutorService для периодического запуска задачи?

В моем случае мне нужно запускать небольшой код для проверки новых данных каждую ночь и создавать новые уведомления, если есть новые данные.

Спасибо!

Ответы [ 3 ]

36 голосов
/ 02 июля 2011

ScheduledExecutorService выполняется в процессе подачи заявки. Если процесс приложения умирает, ни одна из запланированных задач не будет запущена. Отсюда необходимость в Service (чтобы ваш процесс не выходил за рамки активной части жизненного цикла).

Хотя AlarmManager - это критически важная системная служба, которая работает постоянно. И если ваше приложение запланировало что-то и было убито, то AlarmManager может запустить приложение снова (через PendingIntent).

И последнее существенное отличие, о котором никто не упомянул, заключается в том, что AlarmManager знает о WakeLock s и управлении питанием. Это означает, что AlarmManager может активировать устройство Android в указанное время для запуска запланированного задания. * ScheduledExecutorService ничего не знает об управлении питанием и запускает задачу только тогда, когда устройство не находится в состоянии глубокого сна (т. Е. Оно может просто пропустить время).

11 голосов
/ 02 июля 2011

ScheduledExecutorService будет работать, только если у вас есть какой-либо компонент, например Service, работающий постоянно.Следовательно, его следует использовать только в тех случаях, когда компонент будет находиться в памяти по другим причинам, добавляя ценность для пользователя.Наличие компонента в памяти, предназначенного исключительно для наблюдения за временем, является расточительным, и одна из причин, по которой пользователи атакуют разработчиков с помощью средств убийц задач и т. Д.

AlarmManager, является системной службой, предоставляемой операционной системой.Он может запустить компонент, когда время приближается.Следовательно, вам не нужно запускать компонент.

В моем случае мне нужно запускать немного кода для проверки новых данных каждую ночь и создавать новые уведомления, если есть новыеданные.

Это четкий сценарий для AlarmManager.

5 голосов
/ 02 июля 2011

Я думаю, ScheduledExecutorService привязан к вашему процессу и не будет работать, если ваш процесс будет убит. Напротив, AlarmManager управляется ОС, поэтому оно работает, даже если ваше приложение не запущено.

...