LocalBroadcastManager
+ Alarmas
Vamos a ver como crear mensajes internos dentro de nuestra aplicacion.
A diferencia del BroadcastReceiver, el LocalBroadcastManager, limita el alcance a los mensajes propios de la aplicacion.
Un LocalBroadcastManager no se puede usar para recibir mensajes del sistema, y la ventaja más grande que tiene frente a los BroadcastReceiver es la seguridad.
Vamos a agregar un mensaje de difusión local al StartedService de la clase anterior.
Partimos desde la Actividad Prinicipal, y luego:
LocalBroadcastManager.getInstance(MainActivity.this)Las alarmas (basadas en la clase AlarmManager) nos permite realizar tareas basadas en el tiempo independientemente del ciclo de vida de la aplicación.
Por ejemplo podríamos usar una alarma para iniciar un servicio que se encargue de la sincronización de datos una vez al dia.
Las alarmas tienen las siguientes características:
Al momento de crear una alarma, hay 2 tipos de relojes a los que podemos acudir:
El Tiempo Real Transcurrido es un contador de tiempo (milisegundos) que toma como referencia el tiempo desde que se inició el sistema; es decir desde la última vez que se encendió.
En cambio, el RTC es un reloj propiamente dicho.
Dada la naturaleza de cada "Reloj", el Tiempo Real Transcurrido resulta más conveniente cuando se deseen realizar tareas periódicas. No por su exactitud, sino porque no se ve afectado por la zona horaria.
En cambio el RTC que es lo que le da la fecha y hora a nuestro dispositivo; sí se ve afectado por la zona horaria. Y resulta más conveniente para cuando queramos realizar una acción en una determinada fecha o un determinado horario.
Ambos tipos tienen una versión “wakeup”, el cual “despierta” el dispositivo si la pantalla se encuentra apagada.
Esto nos asegura que la alarma se ejecute en el tiempo especificado.
Si no usamos esta versión para nuestra alarma, esta se iniciará la siguiente vez que se repita si el dispositivo se encuentra “despierto”.
Vamos a realizar una aplicación, donde podamos elegir el tipo de alarma a setear y ver sus diferentes aplicaciones:
Vamos a introducir un nuevo elemento de Android, que no habíamos usado hasta el momento. Se trata de un PendingIntent. Como su nombre lo expresa, se trata de un intento pendiente (pendiente de ser ejecutado). Es un token que le damos a otra aplicación (NotificationManager, AlarmManager, HomeWidget o cualquier otra App de terceros); y que le permite a esta otra aplicación ejecutar un bloque de código con los permisos de nuestra aplicación.
En el caso de que sólo queramos iniciar una actividad, le estamos diciendo que actividad queremos iniciar y de que aplicación.
Intent intent = new Intent(TRTActivity.this, AlarmActivity.class);
PendingIntent alarmIntent = PendingIntent.getActivity(TRTActivity.this,
0,
intent,
0);
// Seleccion del tipo de Alarma
int tipoAlarma;
if (cbWakeUp.isChecked()) {
tipoAlarma = AlarmManager.ELAPSED_REALTIME_WAKEUP;
}else{
tipoAlarma = AlarmManager.ELAPSED_REALTIME;
}
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmManager.set(tipoAlarma,
SystemClock.elapsedRealtime() + (1000 * 10),
alarmIntent);
finish();calendar = Calendar.getInstance();
// Seleccion del tipo de Alarma
int tipoAlarma;
if (cbWakeUp.isChecked()) {
tipoAlarma = AlarmManager.RTC_WAKEUP;
}else{
tipoAlarma = AlarmManager.RTC;
}
calendar.add(Calendar.SECOND, 10);
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmManager.set(tipoAlarma,
calendar.getTimeInMillis(),
alarmIntent);getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON |
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);Si queremos que la actividad de la alarma se haga visible cuando el dispositivo esté bloqueado, debemos agregar las siguientes líneas en el onCreate de la misma
// Configuracion
timePicker.setCurrentHour(calendar.get(Calendar.HOUR_OF_DAY));
timePicker.setCurrentMinute(calendar.get(Calendar.MINUTE));
timePicker.setIs24HourView(true);
// Obtener datos del TimePicker a la hora de setear la alarma
calendar.set(Calendar.HOUR_OF_DAY, timePicker.getCurrentHour());
calendar.set(Calendar.MINUTE, timePicker.getCurrentMinute());