2011-07-02 26 views
12

Además de configurar y la hora exacta (es decir, la medianoche) frente a establecer un retraso (es decir, 24 horas), ¿cuál es la diferencia entre utilizar AlarmManager y ScheduledExecutorService para ejecutar una tarea periódicamente?Diferencia entre AlarmManager y ScheduledExecutorService

En mi caso, necesito ejecutar un poco de código para buscar nuevos datos cada noche y crear una nueva notificación si hay nuevos datos.

Gracias!

Respuesta

33

ScheduledExecutorService ejecuta en su proceso de solicitud. Si el proceso de solicitud fallece, ninguna de las tareas programadas se ejecutará. De ahí la necesidad de Service (para que su proceso dure más allá de las actividades de la parte activa del ciclo de vida).

Mientras que AlarmManager es un servicio de sistema crítico que se ejecuta todo el tiempo. Y si su aplicación programó algo y fue asesinado, entonces AlarmManager puede comenzar la aplicación nuevamente (a través de PendingIntent).

Y la última gran diferencia que nadie mencionó aquí es que AlarmManager sabe acerca de WakeLock sy la administración de energía. Esto significa que AlarmManager puede activar el dispositivo Android a la hora especificada para ejecutar la tarea programada. Mientras que ScheduledExecutorService no sabe nada sobre la administración de energía y solo comenzará la tarea cuando el dispositivo no esté en modo de suspensión (es decir, simplemente puede perder la hora).

+0

¿Hay algo más que funcione cuando el dispositivo está en sueño profundo ... Intenté Handler, Runnable Threads, nada funciona en modo de suspensión profunda. – DAC84

5

Creo que ScheduledExecutorService está vinculado a su proceso y no funcionará en caso de que su proceso sea asesinado. En contraste, AlarmManager es administrado por el sistema operativo, por lo que funciona incluso si su aplicación no se está ejecutando.

10

ScheduledExecutorService solo funcionará si tiene algún componente, como Service, ejecutándose todo el tiempo. Por lo tanto, solo se debe usar en los casos en que el componente estaría en la memoria por otros motivos, agregando valor al usuario. Tener un componente en la memoria únicamente para ver cómo funciona el reloj es un desperdicio y una de las razones por las que los usuarios atacan a los desarrolladores con asesinos de tareas y cosas así.

AlarmManager es un servicio del sistema provisto por el sistema operativo. Puede poner en marcha un componente cuando el tiempo llegue. Por lo tanto, no necesita tener el componente en ejecución.

En mi caso, necesito ejecutar un poco de código para buscar nuevos datos todas las noches y crear una nueva notificación si hay nuevos datos.

Este es un escenario claro para AlarmManager.