5.6.-
Programación en Android: El ciclo de la vida – primera parte.
Habíamos
dejado pendiente hablar sobre el ciclo de la vida de las activitys en
android, y vamos a verlo con una imagen y posteriormente (5.6.1) con
un pequeño y sencillo ejemplo, que además nos servirá para mirar
como funciona la clase log.
Las actividades atienden a
varios mensajes del sistema mediante retrollamadas
(callback) desde que comienzan a ejecutarse hasta
que finalizan.
Dado
que la vida de una activity está relacionada o afectada por otras
activities, por sus
tareas y por las tareas predecesoras, puede cambiar de estado (y
cambia) a menudo, y nosotros debemos escuchar los mensajes del
sistema para atender a los estados en los que se haya nuestra
activity y actuar en consecuencia (por ejemplo, guardar todas las
variables de interés cuando nos vamos al estado de parados
(stopped).
En actividad puede existir
básicamente en tres estados:
Resumed
(En ejecución): La actividad
(activity) está en
primer plano de la pantalla y tiene el foco.
Paused
(En pausa): Otra actividad está
en primer plano y tiene el foco, pero la nuestra todavía es visible.
Por ejemplo, cuando otra actividad es visible por encima de la
nuestra, y esa actividad es parcialmente transparente o no cubre toda
la pantalla. Una actividad en el estado de pausa está completamente
viva: el objeto activity
está en memoria, mantiene toda la información de los estados y de
los miembros, y permanece conectada al gestor de ventanas, pero
puede ser eliminada (killed) por el sistema en
situaciones en las que disponga de muy poca memoria.
Stopped
(parada): La actividad está totalmente tapada por otra actividad
que está en primer plano, y la nuestra está en segundo plano o
background.
Una actividad en este estado, todavía está viva: el objeto
activity está en memoria, mantiene toda la información de los
estados y de los miembros, pero no
está conectada al gestor de ventanas.
Sin embargo ya no es visible, y el sistema puede borrarla cuando
necesite memoria para cualquier cosa.
Si
una actividad está parada o en pausa, el sistema puede quitarla de
la memoria a través de su método finish(),
o simplemente matando el proceso. Cuando la actividad se vuelve a
abrir después de haber sido finalizada o matada, debe volver a
crearse.
Implementar
los métodos para atender las llamadas callbacks
Los callbacks son
métodos con los que nuestra actividad atiende a los mensajes con los
que el sistema notifica a la aplicación sus cambios de estado (y
otros eventos). Todos los métodos de callback son conexiones
que podemos modificar/anular (override) para realizar el trabajo
adecuado cuando cambia el estado de nuestra actividad.
Veamos el ejemplo que nos
muestra la ayuda del SDK de android:
public class ExampleActivity extends Activity { @Override public voidonCreate
(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // La actividad está siendo creada. } @Override protected voidonStart()
{ super.onStart(); // La actividad está a punto de hacerse visible. } @Override protected voidonResume()
{ super.onResume(); // La actividad se ha vuelto visible (está ejecutándose, o "resumed") } @Override protected voidonPause()
{ super.onPause(); // Otra actividad está cogiendo el foco. (La actividad está a punto de
// estar en pausa, "paused"). } @Override protected voidonStop()
{ super.onStop(); // La actividad ya no es visible. Ahora está parada ("stopped"). } @Override protected voidonDestroy()
{ super.onDestroy(); // La actividad está a punto de ser destruida } }
Hay que recordar que si
implementamos estos callbacks debemos llamar antes a la
implementación ofrecida por la superclase.
Todos los métodos que hay en
ese ejemplo definen todo el ciclo de la vida de una actividad en
android. Hay tres grupos fundamentales en el ciclo de la aplicación:
Todo
el ciclo de la vida de
una aplicación ocurre entre la llamada a onCreate()
y la llamada a onDestroy().
La
actividad debe de hacer la configuración de todos los estados
globales, como definir el layout
(diseño),
en el método onCreate(),
y liberar todos los recursos en el método onDestroy().
El
ciclo de vida en que es visible
la actividad ocurre entre la llamada a onStart()
y
la llamada a onStop().
Durante este tiempo el usuario puede ver la actividad en la pantalla
e interactuar con ella. Por ejemplo podríamos registrar un
BroadcastReceiver
en onStart()
y desregistrarlo/liberarlo en onStop().
El sistema llamará varias veces a estos métodos durante el ciclo
de vida de nuestra aplicación, como podremos ver en el próximo
capítulo (5.6.1)
El
ciclo de vida en primer plano
de la actividad ocurre entre la llamada a onResume()
y la llamada a onPause().
En este tiempo la actividad está en el primer plano de todas las
demás actividades en pantalla y tiene el foco de entrada del
usuario. Una actividad puede pasar frecuentemente de primer a
segundo plano. Por ejemplo, cuando se llama a onPause()
porque se muestra una ventana de diálogo. Como este estado puede
tener cambios muy frecuentes, es recomendable que el código en estos
métodos no esté muy sobrecargado, con el fin de evitar transiciones
lentas que hagan esperar al usuario.
Guardando
el estado de la actividad.
Habíamos
comentado que cuando una actividad se pausa
o se para,
el estado de la actividad se retiene, porque el objeto de la
actividad todavía está en memoria. Sin embargo, cuando el sistema
destruye la actividad para recuperar memoria, se destruye el objeto
activity,
y perdemos el estado de nuestra actividad. Así cuando el sistema
tenga que volver a recrear
nuestra actividad (si el usuario navega de vuelta a ella), no sabe
que ha sido destruída y espera encontrarse los datos como los había
dejado. En estas situaciones, nosotros podemos asegurarnos de
guardar la información relevante sobre el estado de la actividad
implementando un método de retrollamada
(callback) que
nos permita guardar la información sobre el estado de la actividad y
recuperarla cuando se vuelve a crear dicha actividad.
Este
método de retrollamada es onSaveInstanceState(),
es llamado por el sistema antes de que la actividad sea destruída y
le pasa un objeto tipo Bundle.
En Bundle
es donde podremos guardar la información sobre la actividad como
pares de nombre-valor,
utilizando métodos como putString().
Así cuando el sistema mata al proceso de nuestra actividad y el
usuario vuelve, el sistema pasa el objeto Bundle
al método onCreate()
para que nosotros podamos recuperar el estado de la actividad
previamente guardado en onSaveInstanceState().
Si
no hay información para restaurar se pasa null.
Nota:
No hay garantías de que la función onSaveInstanceState()
sea llamada antes de destruir la actividad, ya que hay casos en los
que no será necesario guardar el estado, por ejemplo si es el
usuario el que abandona la actividad pulsando el botón de atras
(back), ya
que está cerrando explícitamente
la actividad.
Si se llama al método es siempre antes de onStop(),
y posiblemente después de onPause().
Sin
embargo, aunque no implementemos onSaveInstanceState(),
algunos estados de la actividad son recuperados por la implementación
por defecto de dicho método. La implementación por defecto llama a
onSaveInstanceState()
para cada vista (view)
en el layout que
permita dar información sobre que guardar. Casi todos los widgets
de android implementan este metodo de la forma adecuada, así que
cualquier cambio visible a la intarfaz de usuario es automáticamente
guardada y recuperara cuando se recrea la actividad.
Ver.
1.0 – Revisión 6.1.2012
No hay comentarios:
Publicar un comentario