contacto[arroba]digitallearning.es

Clase AlarmManager: planificación de tareas en Android

Post Series: Tareas en segundo plano en Android (II)

Características e implementación de la clase AlarmManager

A continuación vamos tratar las principales características del uso de la clase AlarmManager, además de conocer su implementación a nivel de código.

La clase AlarmManager nos permite acceder al servicio de alarmas del sistema, cuya principal funcionalidad es poder programar operaciones, en un tiempo establecido, fuera del ciclo de vida de la aplicación.
Cuando se dispara una alarma, los diferentes Intents que han sido registrados en el sistema, iniciarán la aplicación si no está en ejecución.

Diagrama Alarm Manager

Principales características:

  • Permite lanzar varios intents en intervalos o tiempos establecidos.
  • Al poder ejecutar operaciones fuera del ámbito de ejecución de la aplicación, será posible el uso de desencadenadores de eventos o acciones, incluso con el dispositivo «dormido».
  • Es posible utilizarlas en combinación con broadcast receivers para iniciar servicios.
  • Ayudan a minimizar el consumo de recursos de la aplicación, programando el consumo de servicios, de manera continua, en operaciones en segundo plano.

Posibles desventajas del uso de AlarmManager:

  • Su flexibilidad limitada puede acarrear grandes consumos de batería en operaciones de red.
  • Para tareas de sincronización con un servidor de datos, Google recomienda el uso de la clase Sync Adapter, debido a que ofrece un abanico más amplio de posibilidades y mayor flexibilidad.
  • Se recomienda su uso para los casos en los que el código de la aplicación se desee ejecutar a una hora determinada, incluso si la aplicación no está iniciada. Para tareas normales en intervalos de tiempo, se recomienda el uso de la clase Handler.

Implementación

En primer lugar llamaremos con la sentencia «import» al packages de la clase AlarmManager:
import android.app.AlarmManager;

Declararemos la clase:
AlarmManager planificarAlarma;

Al no definir un constructor por defecto, se le asigna el servicio de alarmas del sistema:
planificarAlarma = (AlarmManager)getSystemService(ALARM_SERVICE);

Inicializamos un intent para que invoque la clase encargada de registrar el evento del sistema (clase que hereda de BroadcastReceiver).
Intent intent = new Intent(getApplicationContext(), PlanificarTareas.class);

Definimos la clase PendingIntent para lanzar un broadcast, recibiendo como parámetro el intent construido:
PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, 0);

Por último se invocará el método setRepeating(), indicando entre sus parámetros que la alarma se repetirá, incluso si el dispositivo está «dormido», e inicialmente transcurridos 10 segundos desde el arranque, recibiendo como intervalo de tiempo entre repeticiones el valor de una variable, que indicaremos en segundos, además de indicarle el PendingIntent ya inicializado anteriormente:
planificarAlarma.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,10000, tiempo_repeticion*1000, pi);

Nota: Será necesario declarar en el AndroidManifest.xml un «Receiver» que nos permitirá recibir los intents en nuestra Aplicación Android:

 

Documentación oficial BroadcastReceiver

Métodos públicos y Constantes de la clase AlarmManager

En este apartado se mostrarán los métodos y constantes que define la clase AlarmManager, para comprender los diferentes parámetros que maneja dicha clase en su implementación.

Nota: Debido a que la mayoría de métodos reciben entre sus parámetros los valores en milisegundos, se realizará un pequeño ejemplo de como obtener la fecha actual en milisegundos:

Para ello en primer lugar crearemos una istancia de la clase Calendar:
Calendar cal = Calendar.getInstance();

Posteriormente, almacenamos la hora actual en milisegundos, invocando al método setTimeInMillis, que recibirá como parámetro la hora actual, en milisegundos, estableciendo como fecha inicial el 1 de Enero de 1970 00:00:00.0 UTC, a través de la clase System y su llamada al método currentTimeMillis():
cal.setTimeInMillis(System.currentTimeMillis());

Documentación oficial Calendar

Nota: En el ejercicio práctico que veremos el siguiente tutorial, se utiliza el componente TimePicker para convertir los valores introducidos por el usuario en milisegundos.

 

Métodos Públicos Valor que devuelve y Descripción
cancel(PendingIntent operation) void
Cancela las alarmas recibiendo como parámetro el intent correspondiente
set(int type, long triggerAtMillis, PendingIntent operation) void
Planifica una alarma
setExact(int type, long triggerAtMillis, PendingIntent operation) void
Planifica una alarma en el momento exacto programado
setInexactRepeating(int type, long triggerAtMillis, long intervalMillis, PendingIntent operation) void
Programa una alarma, de manera repetida, lanzada en intervalos de tiempo inexactos
setRepeating(int type, long triggerAtMillis, long intervalMillis, PendingIntent operation) void
Programa la repetición de una alarma
setTime(long millis) void
Ajusta la hora del sistema
setTimeZone(String timeZone) void
Establece la zona horaria por defecto del sistema
setWindow(int type, long windowStartMillis, long windowLengthMillis, PendingIntent operation) void
Planifica una alarma, que será entregada dentro de una ventana de tiempo determinada

 

Constante Tipo de dato y Descripción
ELAPSED_REALTIME int
Tiempo de la alarma desde el arranque, incluyendo la pausa.
Valor constante: 3 (milisegundos)
ELAPSED_REALTIME_WAKEUP int
Tiempo de la alarma desde el arranque, incluyendo la pausa, que «despertará» al dispositivo cuando este se apague.
Valor constante: 2 (milisegundos)
INTERVAL_DAY long
Intervalo de repetición inexacta, implementado por el método setInexactRepeating(int type, long triggerAtMillis, long intervalMillis, PendingIntent operation), para las versiones de Android inferiores al API 19.
Valor constante: 86400000 (milisegundos)
INTERVAL_FIFTEEN_MINUTES long
Intervalo de repetición inexacta, implementado por el método setInexactRepeating(int type, long triggerAtMillis, long intervalMillis, PendingIntent operation), para las versiones de Android inferiores al API 19.
Valor constante: 900000 (milisegundos)
INTERVAL_HALF_DAY long
Intervalo de repetición inexacta, implementado por el método setInexactRepeating(int type, long triggerAtMillis, long intervalMillis, PendingIntent operation), para las versiones de Android inferiores al API 19.
Valor constante: 43200000 (milisegundos)
INTERVAL_HALF_HOUR long
Intervalo de repetición inexacta, implementado por el método setInexactRepeating(int type, long triggerAtMillis, long intervalMillis, PendingIntent operation), para las versiones de Android inferiores al API 19.
Valor constante: 1800000 (milisegundos)
INTERVAL_HOUR long
Intervalo de repetición inexacta, implementado por el método setInexactRepeating(int type, long triggerAtMillis, long intervalMillis, PendingIntent operation), para las versiones de Android inferiores al API 19.
Valor constante: 3600000 (milisegundos)
RTC int
Hora de la alarma en System.currentTimeMillis(), que devuelve la hora actual en milisegundos, desde el 1 de enero 1970 00:00:00.0 UTC.
Valor constante: 1 (milisegundos)
RTC_WAKEUP int
Hora de la alarma en System.currentTimeMillis(), que devuelve la hora actual en milisegundos, desde el 1 de enero 1970 00:00:00.0 UTC, y que «despertará» al dispositivo cuando este se apague.
Valor constante: 0 (milisegundos)

Nota: La medida de los valores de las constantes es milisegundos.