Link

Alarmas

En este ejemplo se establecerá una alarma en el dispositivo Android que se lanzará dependiendo de la especificación del usuario. La clase que utilizaremos será AlarmManager y el componente que recibirá la alerta será un BroadcastReceiver.

Android

Primeramente, se recuperan los valores introducidos por el usuario a la que se programa la alarma. Recuperamos las variables y creamos un objeto de tipo Calendar. Esta clase nos ayudará a convertir la hora y minutos a milisegundos.

        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(editTextHora.getText().toString()));
        calendar.set(Calendar.MINUTE, Integer.parseInt(editTextMin.getText().toString()));
        calendar.set(Calendar.SECOND, 0);

A continuación, al igual que hicimos con las notificaciones, definimos un PendingIntent especificando que será un componente de tipo BroadcastReceiver quien lo reciba (podría ser otro componente diferente). Además, pasamos como parámetro el intent explícito hacia la clase donde queremos enviarlo.

        Intent intent = new Intent(this, Alarma.class);
        pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);

Por último, se establece la alarma a través de un objeto de la clase AlarmManager.

        // Se crea la instancia de AlarmManager
        AlarmManager alarmManager = (AlarmManager) this.getSystemService(this.ALARM_SERVICE);

        // Se lanzará de forma inexacta
        alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                AlarmManager.INTERVAL_DAY, pendingIntent);

Esta es una forma de crear una alarma inexacta, la cual puede retrasarse algunos segundos. Es un tipo de alarma que consume menos batería que una exacta. Es la recomendable si no necesitamos que se lance justo en el tiempo especificado.

No hay que olvida que, si es un componente propio el que recibirá la alarma como es el caso, también debemos programarlo.

public class Alarma extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "Alarma", Toast.LENGTH_SHORT).show();
        Log.i("prueba", "alarma lanzada");
    }
}

Es un sencillo BroadcastReceiver como los creados en temas anteriores.