Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma Android
Sesión 2: Intents y navegación entre actividades
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Puntos a tratar
• Intents
• Introducción
• Lanzar actividades
• Navegación
• Tareas
• launchmode e Intents
• Afinidad entre tareas
• Limpiando la pila de actividades
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Intents
• Elemento importante y característico en Android
• Intercambio de información
• Lanzar nuevas actividades o servicios
• De manera explícita o implícita
• Ventajas
• Desacoplamiento de componentes
• Extender fácilmente la funcionalidad de las aplicaciones
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Lanzando actividades con Intents
• Intents explícitos. Parámetros
• Contexto de la actividad actual
• El nombre de la clase de la actividad a lanzar
• Una actividad iniciada con startActivity no notificará su finalización
• Método finish
• Pulsación del botón BACK
Intent intent = new Intent(MiActividad.this, MiOtraActividad.class);
startActivity(intent);
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Lanzando actividades con Intents
• Intents implícitos
• Se indica la tarea que se desea que se lleve a cabo
• No se especifica quién lo hará
• El propio sistema decide la actividad más adecuada en tiempo de ejecución
• Si existen varias alternativas, se muestran en un menú
• Las actividades nativas tienen la misma prioridad que el resto (pueden ser reemplazadas)
• Posibilidad de usar actividades pertenecientes a otras aplicaciones
• Ejemplo: aplicación con toma de fotografías
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Lanzando actividades con Intents
• El Intent implícito debe incluir:
• Identificador de la tarea a realizar
• URI de los datos sobre los que realizar la tarea
• Opcionalmente: datos extra (método putExtra)
Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse(“tel:666666666”);
startActivity(intent);
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Lanzando actividades con Intents
• Algunos identificadores de acción:
• ACTION_ANSWER
• ACTION_CALL
• ACTION_DELETE
• ACTION_DIAL
• ACTION_EDIT
• ACTION_INSERT
• ACTION_PICK
• ACTION_SEARCH
• ACTION_SENDTO
• ACTION_WEB_SEARCH
• ACTION_VIEW
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Subactividades
• Actividades iniciadas con startActivityForResult
• Producen el disparo de un evento en la actividad padre
• Se puede devolver información a la actividad padre
• startActivityForResult
• Funcionamiento similar a startActivity
• Requiere código de petición: valor entero que identifica a la subtarea
private static final int CODIGO_ACTIVIDAD = 1;
Intent intent = new Intent(this, MiOtraActividad.class);
startActivityForResult(intent, CODIGO_ACTIVIDAD);
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Subactividades
• Devolución de resultados
• Utilizar la función setResult antes de finish
• Parámetros:
• Código de resultado: Activity.RESULT_OK, Activity.RESULT_CANCELED o un entero
• El propio resultado (un Intent)
• Puede haber diferentes llamadas a setResult en una misma actividad
• Si se destruye la actividad sin haber llamado a setResult se devuelve automáticamente Activity.RESULT_CANCELED
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Subactividades
botonOk.setOnClickListener(new View.onClickListener() { public void onClick(View view) {
Uri dato = Uri.parse("content://contactos/" + id_contacto_seleccionado);
Intent resultado = new Intent(null, dato);
resultado.putExtra(DATOS_CORRECTOS, datosCorrectos);
resultado.putExtra(TELEFONO_SELECCIONADO, telefonoSeleccionado);
setResult(RESULT_OK, resultado);
finish();
} });
botonCancelar.setOnClickListener(new View.OnClickListener() { public void onClick(View view) {
setResult(RESULT_CANCELED, null);
finish();
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Subactividades
• Manejador del evento en la clase padre
private static final int PRIMERA_ACTIVIDAD = 1;
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode) {
case PRIMERA_ACTIVIDAD:
if (resultCode == Activity.RESULT_OK) { Uri dato = data.getData();
boolean datosCorrectos = data.getBooleanExtra(DATOS_CORRECTOS, false);
String telefono =
data.getStringExtra(TELEFONO_SELECCIONADO);
}
break;
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Respondiendo Intents implícitos
• Intent Filter
• Medio para registrar actividades como capaces
• De realizar una determinada tarea
• Con unos datos concretos
• Elemento <intentfilter> en el Manifest de la aplicación:
<activity android:name=".MiActividad" android:label="Mi Actividad">
<intent-filter>
<action android:name="es.ua.jtech.intent.action.HAZ_ALGO"/>
<category android:name="android.intent.category.DEFAULT"/>
<category
android:name="android.intent.category.ALTERNATIVE_SELECTED"/>
<data android:mimeType="vnd.miaplicacion.cursor.item/*"/>
</intent-filter>
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Acceder a la información de un Intent
• Dentro de onCreate:
• Acceso a los datos del Intent:
Intent intent = getIntent();
String accion = intent.getAction();
Uri datos = intent.getData();
[TIPO] datoExtra = intent.get[TIPO]Extra(IDENTIFICADOR);
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Navegación: tarea
• Colección de actividades con un objetivo común
• Se puede interpretar como una aplicación independiente
• Cada una tiene su propia pila de actividades
• Cuando una actividad se destruye, se saca la primera de la pila
• Cuando se inicia una nueva actividad, la activa pasa al tope de la pila
• Conclusión: las actividades no se reordenan en la pila
• Conclusión: puede haber más de una instancia de una actividad en la pila
• Cuando la pila de actividades queda vacía, la tarea se destruye
• Sólo una tarea en primer plano; el resto mantienen sus
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Navegación: tarea
• Ejemplo de más de una instancia de actividad por tarea
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Navegación: tarea
• Posibles modificaciones en el funcionamiento estándar del lanzamiento de actividades:
• Sólo una instancia de una determinada actividad
• Iniciar una actividad en una tarea independiente
• Eliminar actividades de la pila
• ¿Cómo?
• Atributo launchmode de <activity> en el Manifest de la aplicación
• Flags en Intents
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
El atributo launchmode
• Valores
• standard: comportamiento por defecto
• singleTop: el Intent se envía a la instancia ya existente si está activa
• singleTask: se crea una tarea y se añade a ella la nueva tarea (si ya existía una instancia en una tarea separada se le envía el
Intent)
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
El atributo launchmode
• Valores:
• singleInstance: como el caso anterior, pero nunca se lanza una nueva actividad en la tarea recién creada
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Flags para Intents al lanzar actividades
• Valores:
• FLAG_ACTIVITY_NEW_TASK: equivalente a singleTask
• FLAG_ACTIVITY_SINGLE_TOP: equivalente a singleTop
• FLAG_ACTIVITY_CLEAR_TOP: si ya existe una instancia de la actividad se destruyen las que hay sobre ella en la pila
• FLAG_ACTIVITY_REORDER_TO_FRONT: si ya existe una instancia de la actividad se lleva a primer plano
• FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS: al lanzar la actividad en una nueva tarea, ésta no se muestra en el listado de tareas
• FLAG_ACTIVITY_FORWARD_RESULT
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Flags para Intents al lanzar actividades
• Valores
• FLAG_ACTIVITY_MULTIPLE_TASK: en conjunción con
NEW_TASK, se crea siempre una nueva instancia en una nueva tarea
• FLAG_ACTIVITY_NO_ANIMATION: desactiva la animación de transición de una actividad a la siguiente
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Afinidad entre actividades
• Medio para indicar a qué tarea desea pertenecer una actividad
• Por defecto todas las actividades de una aplicación tienen afinidad con el resto
• Por defecto todas las actividades de una aplicación pertenecen a la misma tarea
• Otras posibilidades:
• Actividades de una misma aplicación pertenecen a diferentes tareas
• Actividades de diferentes aplicaciones forman parte de una misma tarea
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Afinidad entre actividades
• Atributo taskAffinity del elemento <activity> del Manifest
• Valor: identificador en forma de cadena
• Valor por defecto: nombre de paquete de la aplicación
• Se tiene en cuenta cuando
• El Intent usa el flag FLAG_ACTIVITY_NEW_TASK
• Cuando el atributo allowTaskReparenting de la actividad valga true
• Medio por el que se pueden distribuir varias aplicaciones en un único paquete .apk
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Limpiar la pila de actividades
• Comportamiento por defecto: la pila de actividades se vacía si la tarea está sen segundo plano mucho tiempo
• Atributos de <activity> en el Manifest:
• alwaysRetainTaskState: se desactiva el comportamiento por defecto
• clearTaskOnLaunch: se eliminan todas las actividades de la tarea siempre que pase a segundo plano (lo contrario al anterior)
• finishTaskOnLaunch: equivalente al atributo anterior, pero para una actividad individual
• noHistory: la actividad es siempre destruida (y no se guarda en la pila) cuando pasa a segundo plano
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
¿Preguntas...?