CLASE 04
LocalBroadcastManager
+ Alarmas
LocalBroadcastManager
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.
LocalBroadcastManager
Vamos a agregar un mensaje de difusión local al StartedService de la clase anterior.
Partimos desde la Actividad Prinicipal, y luego:
- Creamos la clase para nuestro Receiver
- Creamos una constante para nuestra Acción
- Instanciamos el receiver en el onCreate
- Registramos Y Des-Registramos el Receiver
- Lanzamos el mensaje desde el Servicio
- Declaramos el Receiver en el Manifiesto
LocalBroadcastManager.getInstance(MainActivity.this)
ALARMAS
Alarmas
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.
Alarmas
Las alarmas tienen las siguientes características:
- Permiten disparar Intents periodicamente o en un tiempo definido
- Combinados con un BroadcasReceiver, podemos lanzar Servicios y/o ejecutar otras tareas
- Al trabajar por fuera de nuestra app, podemos ejecutar acciones, por más que la aplicación no esté corriendo e incluso si el dispositivo está bloqueado
- Reducen el consumo de recursos de nuestra app (no necesitamos temporizadores o tareas corriendo en segundo plano todo el tiempo)
Tipos de Alarmas
Al momento de crear una alarma, hay 2 tipos de relojes a los que podemos acudir:
- Tiempo Real Transcurrido
- Reloj de Tiempo Real (RTC)
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.
Tipos de Alarmas
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.
WakeUp
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”.
APLICACION
Aplicacion Alarmas
Vamos a realizar una aplicación, donde podamos elegir el tipo de alarma a setear y ver sus diferentes aplicaciones:
- Creamos la actividad de seleccion del tipo de Reloj
- Creamos una actividad para cada Tipo de Reloj
PendingIntent
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.
Alarma T.R.T.
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();
Alarma R.T.C.
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);
WakeUp Flags
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
Mejoras
- Seleccion de Segundos de TRT
- TimePicker
// 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());
Gracias!
No dejen de consultar cualquier duda que surja
sebasira@gmail.com
Android Avanzando - Clase 04 (alumni 03)
By Ing. Sebastian M. Irazabal
Android Avanzando - Clase 04 (alumni 03)
- 658