Ejecución de tareas periódicas

=Introducción= Tener implementado la función de ejecución de tareas periódicas, según un inicio de tiempo requerido, y que se ejecute cada cierto tiempo, es bastante útil. Permite dejar tareas definidas por el usuario y que se ejecuten en el momento del día que se requiera o a partir de cierto tiempo desde el inicio de la llamada a función.

Implementación de la funcionalidad
El servicio que tiene la ejecución de tareas periódicas es la clase PeriodicService.java dentro del package service. Este servicio, tiene una función principal que es setAlarm como se define como sigue. Como argumentos recibe las cantidades en horas,minutos y segundos a partir de la cual iniciar el AlarmManager que utiliza en la clase.

protected static void setAlarm(Context context, int hour, int minutes,int seconds,long interval, Class<? extends PeriodicService> clazz) { AlarmManager alarmMgr;

Calendar calendar = Calendar.getInstance; calendar.add(Calendar.HOUR_OF_DAY, hour); calendar.add(Calendar.MINUTE, minutes); calendar.add(Calendar.SECOND, seconds); calendar.set(Calendar.MILLISECOND, 0);

// RTC_WAKEUP... int type = AlarmManager.RTC_WAKEUP; alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

// Alarm time in System.currentTimeMillis (wall clock time in UTC), which will wake up the device when it goes off. long triggerAt = calendar.getTimeInMillis;

Log.d(LOG_TAG, String.format("Alarma %s hora: %s", clazz.getSimpleName, calendar.getTime));

if (Build.VERSION.SDK_INT >= 19) { alarmMgr.setExact(type, triggerAt, getPendingIntent(context, clazz)); } else { alarmMgr.setRepeating(type, triggerAt,interval, getPendingIntent(context, clazz)); }   }

Hay otro método de la misma función que es para establecer la hora y el minuto del día en el que se inicia la tarea asignada al Servicio, a diferencia del otro que seria un cronometro a partir del momento de la llamada.

Llamada y setting del service
Para poder settear una tarea periódica a esta función, lo mejor seria definir una clase nueva que extienda a PeriodicService.java y tenga una función setAlarm de la siguiente forma:

public static void setAlarm(Context context) { if (context != null) { ParseUser user = ParseUser.getCurrentUser; if (user != null) { setServiceClass(TestServiceNotification.class); PeriodicService.setAlarm(context, 0, 2, 0,Constants.ONE_DAY,getServiceClass); }       }    } Podemos notar como primero se settea una clase del tipo service que es la que PeriodicService reconoce y ejecuta en las llamadas.

Una llamada a estas alarmas o procesos periódicos se puede mostrar más adelante, el momento en el que se llaman dependerá de cada caso, donde el programador decidira el más conveniente. He aqui el ejemplo de la llamada que realiza Mbo`ehao.

TestServiceNotification.setAlarm(context);