Plataforma Android Sesión 2: Intents y navegación entre actividades 2011 2012 Depto. Ciencia de la Computación e IA
Puntos a tratar Intents Introducción Lanzar actividades Navegación Tareas launchmode e Intents Afinidad entre tareas Limpiando la pila de actividades Intents y navegación 2
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 Intents y navegación 3
Lanzando actividades con Intents Intents explícitos. Parámetros Contexto de la actividad actual El nombre de la clase de la actividad a lanzar Intent intent = new Intent(MiActividad.this, MiOtraActividad.class); startactivity(intent); Una actividad iniciada con startactivity no notificará su finalización Método finish Pulsación del botón BACK Intents y navegación 4
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 Intents y navegación 5
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); Intents y navegación 6
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 Intents y navegación 7
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); Intents y navegación 8
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 Intents y navegación 9
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(); } }); Intents y navegación 10
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; } } Intents y navegación 11
Respondiendo Intents implícitos Intent Filter Medio para registrar actividades como capaces De realizar una determinada tarea Con unos datos concretos Elemento <intent filter> 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> </activity> Intents y navegación 12
Acceder a la información de un Intent Dentro de oncreate: Intent intent = getintent(); Acceso a los datos del Intent: String accion = intent.getaction(); Uri datos = intent.getdata(); [TIPO] datoextra = intent.get[tipo]extra(identificador); Intents y navegación 13
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 actividades intactas (si no son necesarios más recursos) Intents y navegación 14
Navegación: tarea Ejemplo de más de una instancia de actividad por tarea Intents y navegación 15
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 Intents y navegación 16
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) Intents y navegación 17
El atributo launchmode Valores: singleinstance: como el caso anterior, pero nunca se lanza una nueva actividad en la tarea recién creada Intents y navegación 18
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 Intents y navegación 19
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 Intents y navegación 20
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 Intents y navegación 21
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 Intents y navegación 22
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 Intents y navegación 23
Preguntas...? Intents y navegación 24