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