Arrancar una actividad en una nueva tarea desde un receptor de anuncio

El concepto de tarea no había sido introducido en el curso. Sin embargo, resulta sencillo y seguro que si eres usuario de Android estás familiarizado con él. La forma más sencilla de entenderlo es que pulses en tu dispositivo móvil el botón de Casa durante un segundo. Se mostrará la lista de tareas que hay actualmente en ejecución o que fueron ejecutadas recientemente. Puedes intercambiar de tarea sin más que pulsar sobre una de las previsualización que aparece en pantalla.

No hay que confuncir el concepto de tarea con el de aplicación. Para iniciar una nueva tarea puedes pulsar al botón de Casa y pulsar sobre uno de los iconos de la pantalla inicial. De esta forma se iniciará la aplicación correspondiente, por ejemplo el lector de correo. Desde esta tarea se pueden arrancar nuevas aplicaciones, por ejemplo, desde un correo podemos acceder a una URL ejecutando el navegador Web. Esta nueva aplicación se ejecutará en la misma tarea.

Otro aspecto a destacar es que cada tarea tiene una pila de actividades independiente. Es decir, si pulsamos en botón de Volver en la tarea descrita pasaremos de nuevo al lector de correo. Pero, si cambiamos de tarea y pulsamos el botón de Volver el resultado será muy diferente.

Ejercicio paso a paso: Arranque de una actividad al llegar un SMS.

 

Vamos a modifica el proyecto Asteroides para que se arranque automáticamente la actividad AcercaDeal llegar un SMS cualquiera.

1.     Abre el proyecto Asteroides.

2.     En AndroidManifest.xml pide el permiso adecuado y registra el receptor de anuncios:       

<uses-permission android:name ="android.permission.RECEIVE_SMS "/>

<aplication>

<receiver android:name="ReceptorSMS" >

   <intent-filter>

      <action android:name="android.provider.Telephony.SMS_RECEIVED"/>

   </intent-filter>

</receiver>

</aplication>

3.     Crea una nueva clase con el siguiente código:


public class ReceptorLlamadas extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

  Intent i = new Intent(context, AcercaDe.class);

             i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

             context.startActivity(i);

       }

}

La forma de arrancar una actividad desde un receptor de anuncios es muy similar  a la que estudiamos en el capítulo 3. La única diferencia es que ahora hemos necesitado añadir un flag a la intención, que indica que la actividad sea creada en una nueva tarea.

4.  Ejecuta la aplicación. Envia un SMS al dispositivo y verifica que se habre la actividad Acerca de …

NOTA: Si utilizas el emulador puedes utilizar la vista EmulatorControl.para mandar simular el envio de un SMS. Si utilizas un dispositivo real o un emulador Genymotion puedes descargarte la siguiente aplicación Sms emulator (https://play.google.com/store/apps/details?id=act.main ).

Cuando lanzamos una nueva actividad, Android nos permite controlar en que tarea y en que posición de la pila se situará. No obstante, se recomienda usar siempre el sitema estándar. Es decir, si lanzamos una nueva actividad desde otra actividad, la nueva actividad se situa en la misma tarea en la cima de la pila de actividades. Cuestión diferente es lanzar la actividad desde un receptor de anuncios, dado que cuando llege el SMS podemos encontrarno en cualquier tarea. En este caso, resulta imprescindible activar el flag FLAG_ACTIVITY_NEW_TASK, así, en caso de no existir la tarea esta podrá ser creada.

Enlaces de interes:

Lanzar las actividades de laa forma estándar suele ser lo más adecuado en la mayoría de los casos. No obstante, si quieres profundzar sobre este tema te recomendamos los siguientes enlaces:

·         Tasks and Back Stack:Documentación oficial de Android:

http://developer.android.com/guide/components/tasks-and-back-stack.htm

·         Manipulating Android tasks and back stack:Presentación didáctica con muchos ejemplos:

http://es.slideshare.net/RanNachmany/manipulating-android-tasks-and-back-stack

 

Lee la siguiente sección del libro "El gran libro de Android",  para saber más:

8.4.3 Arrancar un servicio tras cargar el sistema operativo

{jcomments on}