Programación multimedia y dispositivos móviles
25 de Febrero de 2013
4.142 Palabras (17 Páginas)536 Visitas
Programación multimedia y dispositivos móviles
4.6.Programar con varias Activities
Una aplicación generalmente usa y tiene varias activities. Una Activity principal “main”, es aquella que se muestra cuando el usuario ejecuta la aplicación. Luego esta Activity puede lanzar otra Activity, esta otra y así sucesivamente. Cada vez que un nueva activitiy se inicia, la Activity previa es parada (onStop), pero el sistema mantiene la Activity en una pila de activities. Cuando una nueva Activity se inicia se coloca en la cima de la pila y toma el foco del usuario. Dado que es una pila, cuando el usuario pulsa el botón “Atrás” del dispositivo, la Activity es eliminada de la pila y destruida (onDestroy), así, la Activity anterior guardada en la pila toma el foco de nuevo (onResume). Todos estos cambios de estado de la Activity es lo que se denomina ciclo de vida de una Activity y por cada estado existe un evento asociado donde podemos programar acciones. Por ejemplo ,en onStop la Activity debería liberar de memoria objetos de gran tamaño y conexiones de red o bases de datos, o por ejemplo en onResume podría readquirir los recursos necesarios para continuar con las tareas interrumpidas.
4.6.1. Ciclo de vida de una Activity. onCreate No visible
El sistema llama a este método cuando crea la Activity. Aquí se deben realizar tareas de inicialización de controles y llamar a setContentView para mostrar un layout.
onStart No visible La Activity está apunto de ser visible.
onResume Visible La Activity se visualiza, recibe el foco y se ejecuta. Se suelen readquirir recursos para
continuar con las tareas interrumpidas. onPause Puede estar parcialmente visible
Otra actividad va a recibir el foco, la actual se mantiene pone en pausa y podría no pararse(onStop), siempre que sea todavía visible (ej. ventana de diálogo que no cubre toda la pantalla). Es el primer estado en donde la Activity puede llegar a ser destruida por el sistema en casos de extrema necesidad de memoria, es por ello que aquí deberíamos salvar los cambios persistentes (entre distintas ejecuciones de la aplicación). Además, los eventos siguientes a onPause: OnStop y OnDestroy, podrían no ser llamados por el sistema cuando este elimina la Activity en caso de emergencia de memoria, por lo que el evento más seguro para almacenar datos persistentes es este: onPause.
También se suele usar para animaciones y otras tareas que consuman CPU en este evento. Nota: Las tareas en este evento no deben consumir muchos recursos del sistema, dado que
este es un evento que se ejecuta con mucha frecuencia y puede ralentizar mucho la aplicación y el dispositivo.
onStop No visible La Activity ha quedado oculta por otra (o está siendo destruida), y ya no tiene el foco. En
necesidad de memoria podría ser eliminada por el sistema Android. Si vuelve a recibir el foco se ejecuta el evento onRestart().
onDestroy No visible Útil para liberar recursos o finalizar threads en segundo plano. La Activity se elimina
definitivamente la Activity de memoria.
52
Programación multimedia y dispositivos móviles
Mediante programación se puede cerrar una Activity con el método finish(). O puede ser destruida por el sistema, en cualquiera de estos casos la Activity debe será creada de nuevo. Podemos distinguir ambas situaciones en este evento con el método isFinishing().
53
Programación multimedia y dispositivos móviles
A continuación se muestra el código de los eventos sobrescritos en una Activity:
public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // La Activity está siendo creada } @Override protected void onStart() { super.onStart(); // La Activity está apunto de ser visible } @Override protected void onResume() { super.onResume(); // La Activity ya es visible } @Override protected void onPause() { super.onPause(); // Otra Activity ha tomado el foco } @Override protected void onStop() { super.onStop(); // La Activity ya no es visible } @Override protected void onStart() { super.onStart(); // La Activity pasa de Stop a Start } @Override protected void onDestroy() { super.onDestroy(); // La Activity se destruye } }
54
Programación multimedia y dispositivos móviles
EJERCICIO: Crea una Activity como la anterior que sobrescriba todos los métodos de evento asociados con los posibles estados de una Activity y comprueba que los estados por los que pasa la Activity corresponden con el gráfico del ciclo de vida de una activity.
En cada evento muestro un mensaje de información en el Log (sistema de mensajes de depuración) para indicar el evento que se ejecuta la Activity. Para ello, haz una llamada al método estático i de la clase Log, por ejemplo:
Log.i("Evento ejecutado:","Estado onCreate");
Los dos parámetros que recibe son el TAG (una etiqueta para identificar mensajes relacionados) y el String con el mensaje de depuración.
1. Ejecuta la aplicación. 2. ¿Qué eventos se han ejecutado tras lanzar la aplicación la primera vez?. Puedes buscar
estos mensajes en la pestaña LogCat de Eclipse.
3. Borra el Log
4. Realiza una pulsación corta en el botón “Home” del dispositivo. ¿Qué eventos se han ejecutado ahora?
5. Borra el Log 6. Realiza una pulsación larga en el botón “Home” y vuelve a mostrar la Activity. ¿Qué
eventos se han ejecutado ahora?
4.6.2. Salvar el estado de una actividad El estado de una Activity se refiere a los valores actuales de la Activity contenidos en los
controles y en otras variables que hemos creado en la Activity las cuales son importantes para definir el estado de la Activity.
Mantener el estado anterior de un Activity demuestra que la aplicación desarrollada es profesional y ayuda al usuario en procesos repetitivos.
Cuando una Activity pasa por los estados pause y stop, los datos de la Activity todavía permanecen en memoria pues esta todavía no se han destruido, por lo tanto cuando la Activity vuelve a mostrarse y tomar el foco se mostrará tal y como estaba. Sin embargo, si la Activity se destruye por código o con el botón atrás del dispositivo, el estado de la Activity se perderá, siendo este el comportamiento deseado, en estos casos si queremos salvar algún dato persistente entre distintas ejecuciones de la Activity(como un dibujo no finalizado) deberíamos hacerlo hecho en el evento onPause. Por el contrario, si es el sistema es quien destruye la Activity o bien simplemente se cambia la orientación de pantalla del dispositivo o el usuario ha cambiado la configuración del idioma, etc., en estos casos la Activity se vuelve a generar de nuevo y es recomendable haber guardado el estado de la Activity para que esta se vuelva a mostrarse tal y como estaba, por ejemplo para que siga reproduciéndose una música de fondo en el punto en que estaba y vuelva a reproducirse desde el principio.
Para guardar el estado de una Activity en estos casos disponemos del método de evento onSaveInstanceState() que es llamado automáticamente por el sistema cuando detecta la necesidad (por ejemplo cuando se cambia la orientación de la pantalla del dispositivo). El sistema envía a este método un objeto Bundle, en cual podemos grabar información de la Activity en formato nombre-valor, mediante los métodos putString y putInt(). Así cuando se vuelva a mostrar la Activity, se enviará ese objeto Bundle al método de evento onCreate y al
55
Programación multimedia y dispositivos móviles
método de evento onRestoreInstanceState() (que se ejecuta después de onStart). La primera vez que se ejecuta la Activity este objeto , lógicamente es nulo (null).
Nota: Existe una implementación por defecto de onSaveInstanceState() y onRestoreInstanceState() y Create(), que guardan el estado de los controles y es recuperado automáticamente, siempre y cuando añadamos el atributo id a cada View de la interfaz. Por ellos es siempre importante llamar al método super en estos tres métodos de eventos, para no perder este automatismo. De este modo, sólo es necesario guardar los valores que no están en los controles de la interfaz gráfica.
4.6.3. Crear una Activity
Tras crear una subclase de Activity, esta debe ser declarada en el fichero AndroidManifest.xml para que puede ser utilizada por el sistema. Para declarar una Activity debemos añadir una etiqueta <activity> dentro de la etiqueta <application>, por ejemplo
<manifest ... > <application ... > <activity android:name=".MainActivity" /> ... </application ... > ... </manifest >
La etiqueta <activity> admite además de la propiedad android:name, cuyo valor corresponde con un punto y el nombre de la clase JAVA de la Activity, otros como:
android:icon Para asignarle un icono a la Activity android:label Para asignarle un título a la Activity
A su vez una etiqueta <activity> puede incluir otras etiquetas hijas como <intent-filter> para indicar qué otros componentes pueden lanzarla. Por ejemplo para indicar que una Activity debe ser la primera en lanzarse al ejecutar la aplicación (android.intent.action.MAIN) y que debe incluirse en el listado
...