artículo escrito por Luisinho
Luisinho
23-03-2013
Gestionando los ciclos de una actividad

Cuando un usurio maneja nuesta aplicación, las vistas o actividades pasan por diversos estados. Desde que la aplicación se ejecuta por primera, hasta que pasa a un primer plano en nuestro dispositivo, la "vida" de la aplicación ha pasado por varios estados, el sistema ha ejecutado de un estado a otro diversos métodos que definen el layout y los componentes de la misma, para que la aplicación funcione correctamente. Si el usuario cambia de vista o si abre otra aplización, el sistema ejecutará otros métodos durante el proceso de cambio de estados.

{banner=500}

En dichos estados, tu prodrás controlar métodos y tareas que al aplicación ejecutará cuando acceda a un estad determinado. Por ejemplo, si tu aplicación está usando la cámara o la conexión wifi y la pasas a estado de defgundo plano, lo ideal sería que liberases al dispositivo del uso dela cámara o del wifi, de esta forma liberarás recursos y consumo de batería, lo mismo con el GPS.


En este articulo vamos a explicar qué métodos se ejecutan en los posibles estados de una vista o actividad:

  • Inicio de la actividad, cuando se ejecuta por primera vez.
  • Pausa y resume de la actividad, cuando la vista queda parcialmente bloqueada por otro cuadro de diálogo.
  • Paro y reinicio de la actividad, cuando la actividad es finalizada y cuando se vuelve a iniciar.

Inicio de la actividad

A diferencia de otros paradigamas de programación cuando se ejecuta el método main(), en Android cuando se inicia una actividad, ésta invoca a unos métodos específicos correspendientes a nuevo estado de la vista. Invoca unos métodos para su inicio y otros para su destrucción.

Entendiendo los flujos de estado

Durante la vida de una actividad, el sistema llama a diferentes métodos dependiendo del estado en el que se encuentra. Estos estados forman una especie de pirámide escalonada, y en cada paso de dicha pirámide intervienen unos métodos especificos que son invocados al pasar o salir de dicho estado. El punto más alto de la pirámide está ocupado por la visca cuando está en primer plano o operativa para el usuario.

Ciclos de vida de una actividad en Android

Dependiendo de la naturaleza de tu aplicación será necesario preveer unos estados y otros no, pero la buena aplicación y entendimiento de los métodos ejecutados en dichos estados hará que tu aplicación sea más eficiente en diversos aspectos:

  • evitarás que la aplicación deje de funcionar inesperadamente si se interrumpe por una llamada u otra aplicación mientras se use la tuya.
  • no consumiras recursos mientras tu aplicación no esté activa.
  • el usuario no perderá información si tu aplicación pasa inactiva más tiempo de lo normal y vuelve a ella.
  • no se perderá información o dejará de funcionar si la pantalla es girada cambiando la orientación de la aplicación.

Vamos a ver las diverdas situaciones en las que una aplicaciñón se puede encontrar, pero las básicas y principales serán:

Resumed,
cuando la actividad se encuentra en primer plano y el usuario puede interactuar con ella.

Paused,
cuando la actividad o vista se encuentra parcialmente inactiva por otra actividad que se encuentra en ese momento por encima. Durante este estado, el usuario no podrá actuar sobre la vista.

Stopped,
la actividad está en un segundo plano, completamente oculta y bloqueada para su uso. Durante este estado, todas las variables son mantenidas pero no se puede ejecutar ningún script.

Los otros estados (Created y Started) son ejecutados al inicio de la actividad y pasan de uno a otro directamente. Cuando se ejectuta onCreate() pasa a onStart() y seguidamente a onresumed().

Estos son los pasos básicos del ciclo de una actividad. Veamos paso por paso lo métodos de dicos estados.

Especificando la actividad inicial

Cuando se selecciona tu aplicación en el esritorio de tu dispositivo, se ejecuta el método onCreated() de la actividad que se ha especificado para ser la actividad "launcher" (o main). Esta actividad será la que servirá como punto de partida para la interface de usuario.

Puedes definir la vista inicial de tu aplicación desde el manifest, AndroidManifest.xml, se indica mediante el elemento que incluye las acciones MAIN y LAUNCHER:

<activityandroid:name=".MainActivity"android:label="@string/app_name">
   

       
<actionandroid:name="android.intent.action.MAIN"/>
       
<categoryandroid:name="android.intent.category.LAUNCHER"/>
   

Si estas acciones no se encuentran declaradas, no aparecerá el icono en nuestro dispositivo.

Crear una nueva instancia

La mayoría de las aplicaciones incluyen diferentes actividades que permiten al usuario realizar acciones. Cuando el usuario selecciona nuestro icono en el dispositivo o realizar una acción que llama a otra actividad, el sistema crea una instancia de dicha actividad llamando a su método onCreate()

onCreate() debe ser empleado par nos permite crear un inicio básico de una aplicación, definiendo la vista inicial y algunas variables que serán usadas durante la aplicación.

TextView mTextView;// Member variable for text view in the layout

@Override
publicvoid onCreate(Bundle savedInstanceState){
   
super.onCreate(savedInstanceState);

   
// Set the user interface layout for this Activity
   
// The layout file is defined in the project res/layout/main_activity.xml file
    setContentView
(R.layout.main_activity);
   
   
// Initialize member TextView so we can manipulate it later
    mTextView
=(TextView) findViewById(R.id.text_message);
   
   
// Make sure we're running on Honeycomb or higher to use ActionBar APIs
   
if(Build.VERSION.SDK_INT >=Build.VERSION_CODES.HONEYCOMB){
       
// For the main activity, make sure the app icon in the action bar
       
// does not behave as a button
       
ActionBar actionBar = getActionBar();
        actionBar
.setHomeButtonEnabled(false);
   
}
}

Si os fijáis, en el método preguntamos por la versión de Andrid en el dispositivo ya que se usan APIs sólo disponibles para la versión HoneyComb y superiores.

Una vez que termina de ejecutarse onCreate(), el sistema para a onStart() y seguidamente a onResume(). La aplicación nunca permanecerá en onCreate() ni en onStart(). Técnicamente onStart() es cuando la aplicación se hace visible para el usuario, pero es realmente onResume() donde éste puede interactuar y utilizar nuestra aplicación hasta que algo lo cmabie, como puede ser una llamada o un acceso al navegador.

Destruir una actividad

Si el primer método de una actividad es onCreate(), el último es onDestroy(), y nos permite el poder liberar al dispositivo del uso de memoria.

La mayoría de las aplicaciones no necesitan del método onDestroy(), ya que cuando las referencias locales se destruyen con la actividad y mediante los métodos  onPause() y onStop() se realizan acciones de limpieza en la aplicación. Pero si tu aplicación incluye acciones en el background creadas en onCReate() o uso de recursos durante un periodo largo de tiempo, éstos podrían dar problemas si no se cierran correctamente.

@Override
publicvoid onDestroy(){
   
super.onDestroy();  // Always call the superclass
   
   
// Stop method tracing that the activity started during onCreate()
    android
.os.Debug.stopMethodTracing();
}

Pausando una actividad

Cuando estás utilizando una aplicación, es posible que durante su uso la actividad pase a un segundo plano por diversos motivos, porque se ha abierto una nueva vista, pero la vista anterior sigue sindo visible o está desvanecida y no tiene el foco. Es en ese momento cuando la actividad pasa al estado de pausa y el sistema llama al método onPause() para ejecutar el código previsto para esos caso, como por ejemplo dejar de reproducir un vídeo. Es en ese momento cuando se realizan las tareas de limpieza de métodos y recursos que no van a ser empleados en la nueva vista.

Las acciones que más suelen realizar son:

  • Parar animaciones y otras acciones quepuedan consumir recursos de CPU
  • Confirmar el guardado de datos si se van a perder en la nueva vista (como cuardar un correo en borradores)
  • Liberar recursos del sistema, como puede ser el uso del GPS y otros que puedan incrementar el uso de la batería
@Override
publicvoid onPause(){
   
super.onPause();  // Always call the superclass method first

   
// Release the Camera because we don't need it when paused
   
// and other activities might need to use it.
   
if(mCamera !=null){
        mCamera
.release()
        mCamera
=null;
   
}
}

Procura no realizar tareas pesadas en el evento onPause() como por ejemplo guardar en la base de datos, ya que retardará el inicio de la siguiente actividad, pasando estas operaciones a onStop()

Cuando una actividad está en el estado de pausa, ésta permanece residente en memoria a laespera de volver a ser activada, con lo que no será necesario reinicializar los métodos que ya tenía en el estado Resume.

Reanudar las actividades

Cuando reanudas una actividad, el sistema llama al método onResume() para volver a retomar ciertos recursos quehayan sido eliminados.

Si nos fijamos en el gráfico, onResume() es invocado cuando una actividad pasa a un primer plano y cuando es llamada por primera vez, con lo que será donde inicializamos de nuevo los componentes que hayan sido eliminados en onPause() y otras que se deban inicia al pasar al primer plano, como iniciar animaciones.

En este ejmeplo de script, comprobaremos que la cámara no está habilitada y lo habilitaremos onResume()

@Override
publicvoid onResume(){
   
super.onResume();  // Always call the superclass method first

   
// Get the Camera instance as the activity achieves full user focus
   
if(mCamera ==null){
        initializeCamera
();// Local method to handle camera init
   
}
}

Parando y arrancando actividades

Estos dos estados son muy importantes, ya que permiten al usuario tener la sensación de que tu aplicación está funcionando y no pierde sus progresos. Se pasa de un estado a otro por ejemplo cuando:

  • el usuario aprita el botón de aplicaciones abiertas y pasa a otra aplicación. Si el usuario abre tu aplicación desde el icono o desde "Aplicaciones recientes" ésta volverá a su estado resume.
  • el usuario, desde tu aplicación, abre otra actividad, con lo cual se para la anterior y se inicia la nueva actividad creada, su el usuario aprieta el botón de "volver" ésta pasará de nuevo a resume.
  • el usuario recibe una llamada mientras usa la aplicación.

La clase de la actividad viene provista de los métodos onStop() y onRestart() para parar o iniciar los procesos oportunos. A diferencia del estado "pausa", cuando una aplicación está parada, esta pierde completamente el foco completamente permaneciendo oculta al usuario y ejecutando una vista totalmente separadad ésta.

Parar la actividad

Cuando una actividad recibe una llamada al método onStop(), ésta deberá liberar todos los recursos que no le sean necesarios cuando no se está usando. Una vez que la actividad es detenida, el sistema podrá eliminar su instancia si requiere de más memoria. En casos estremos, el sistema podría matar el proceso sin llamar al método onDestroy() por lo que resulta muy importante el uso de onStop() para liberar recursos del sistema.

Aunque primeramente la actividad pasa por el método onPause(), el uso de onStop() es de suma importancia para procesos más pesado, como la grabación de datos.

El siguiente ejemplo guarda el borrador del un texto en la memoria persistente.

@Override
protectedvoid onStop(){
   
super.onStop();  // Always call the superclass method first

   
// Save the note's current draft, because the activity is stopping
   
// and we want to be sure the current note progress isn't lost.
   
ContentValues values =newContentValues();
    values
.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText());
    values
.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle());

    getContentResolver
().update(
            mUri
,    // The URI for the note to update.
            values
,  // The map of column names and new values to apply to them.
           
null,    // No SELECT criteria are used.
           
null     // No WHERE columns are used.
           
);
}

Cuando una actividad es parada, permanece en memoria del sistema hasta que sea reiniciada. Una vez que pasa al estado onResume, no será necesario reinicializar ls componentes, incluso mantendrá el contenido de los campos de texto.

Iniciar/reiniciar una actividad

Cuando una actividad para primer plano, después de haber sido parada, ésta llama al método onRestart() y después al onStart(), el cual siempre aparece cuando la vista pasa a tener el foco del usuario. Restart() es llamado cuando la aplicación viene de estar onPause() la cual nospermite realizar unaserie de tareas, siempre que venga de estar parada, no destruida.

Aunque el ciclo de la aplicación pasa por onRestart() cuando una aplicación viene de onStop(), no es habitual el uso de este método, ya que es onStart() donde se inicia realmente el uso de la actividad y será ahí donde deberemos controlar nuestra vista cuando venga de onStop().

En el siguiente ejemplo veremos cómo es onStart donde realmente se preveen los recursos necesario de laaplicación puesto queya se hizo cuando la aplicación es iniciada por primera vez.

@Override
protectedvoid onStart(){
   
super.onStart();  // Always call the superclass method first
   
   
// The activity is either being restarted or started for the first time
   
// so this is where we should make sure that GPS is enabled
   
LocationManager locationManager =
           
(LocationManager) getSystemService(Context.LOCATION_SERVICE);
   
boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
   
   
if(!gpsEnabled){
       
// Create a dialog here that requests the user to enable GPS, and use an intent
       
// with the android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS action
       
// to take the user to the Settings screen to enable GPS when they click "OK"
   
}
}

@Override
protectedvoid onRestart(){
   
super.onRestart();  // Always call the superclass method first
   
   
// Activity being restarted from stopped state    
}

Cuando el sistema destruye la actividad, llama al método onDestroy(). Puesto que deberíamos haber liberado recursos y almacenado nuestros datos en el método onStop(), realmente en el método onDestroy() hay poco porrealizar, pero será nuestra última oportunidad de guardar nuestros datos y de liberar recursos quetal vez no hayan sido eliminados.

Esta gráfica representa los estados de una vista y los métodos que son invocados al pasar de un a otro estado.Esta gráfica representa los estados de una vista y los métodos que son invocados al pasar de un a otro estado.
En esta figura vemos los tres primeros estados de una actividad, siendo onResume() donde el usuario interactúa con ellaEn esta figura vemos los tres primeros estados de una actividad, siendo onResume() donde el usuario interactúa con ella
Una actividad puede pasar de estado onResume() a onPause() por diversos motivosUna actividad puede pasar de estado onResume() a onPause() por diversos motivos
Cuando una aplicación o vista es parada, ésta deja de ser visible al usuario y ejecuta una vista totalmente separada. Al reiniciarse pasa por los métodos onRestart(), onStart() y onResume()Cuando una aplicación o vista es parada, ésta deja de ser visible al usuario y ejecuta una vista totalmente separada. Al reiniciarse pasa por los métodos onRestart(), onStart() y onResume()
Identifícate en NoEsTanDificil

Área Privada

Anónimo
Regístrate como usuario

Destacados

Bote de bolas de padel / tenis gratis

Buscador

BlogRoll

Galería privada de fotos

Suscripciones

¿quieres recibir un aviso de actualizaciones?

Síguenos en...

Últimos comentarios

 rashp en Instalar apache+php+mysql en Windows y Ubuntu: En algunos casos hay que montar la particion de windows cuan...
 anónimo en Protege a los tuyos de internet: Muchas gracias por la información!!!
 Luisinho en Instalar apache+php+mysql en Windows y Ubuntu: he actualizado el post... parece ser qe ahora, desde la vers...
 ssnc en Curso de Internet para abuelos... NoEsTanDificil¡¡: :O se me hace interesante, quizas tbn nos podrias enseñar d...
 sushimaniberico en Probar buen sake en Palma: Hey! que grata sorpresa. Un millón de gracias por el post. ...
 ssnc en Vaya nevada!!!: u.u Como quisiera yo algo de nieve por aca. Con 30°c no se ...