En la mayoría de los casos, una aplicación
Android es independiente y se ejecuta dentro de su propio proceso.
Cada proceso tiene su propia máquina
virtual de Java que a su vez reside en un proceso de Linux – Kernel
administrado.
El proceso es creado para ejecutar el
código de la aplicación y es el sistema quien pedirá y reclamará su memoria
para reasignarla a otra aplicación.
A cada aplicación se le asigna un
identificador de usuario (UID)
distinto. Los permisos de los archivos que refieren a la aplicación (caché,
datos, etc.) son solo accesibles por dicho usuario.
Tiempo de vida de un proceso
Android como SO usa el 100% de la memoria
RAM. Si luego otro programa tiene que acceder a la memoria RAM, libera memoria
para poder acoger a dichas aplicaciones.
El tiempo de vida de un proceso no está controlado
directamente por la aplicación y el usuario. Es el sistema el que lo gestiona.
Prioridad
de los procesos / Estados de una actividad
Activa.
En primer plano y actualmente ejecutándose.
Pausada.
Actividad ejecutándose y visible, pero alguna notificación está
sobrepuesta a la pantalla.
Parada.
La actividad sigue ejecutándose pero se encuentra oculta por
otras actividades lanzadas. En este estado la actividad no muestra información
útil para el usuario directamente pero sí mediante notificaciones.
Terminada.
O bien nunca se inició o ha sido terminada por el sistema por la
falta de memoria disponible.
Métodos
- onCreate(). Se dispara cuando la Activity es llamada por primera vez. Aquí es donde debe crearse la inicialización normal de la aplicación, crear vistas, cargar los datos a visualizar, etc. Este método da acceso al estado de la aplicación cuando se cerró ya que recibe un objeto de tipo Bundle. Si no es la primera vez que se crea esta actividad en la ejecución actual de la aplicación, el objeto Bundle contendrá lo necesario para restaurar el estado anterior para que el usuario se lo encuentre tal y como lo dejó.
- onStart(). Este método se ejecuta cuando el sistema tiene intención de hacer visible la actividad, aunque luego no llegue a ocurrir realmente. Se suele utilizar para crear aquellos procesos cuyo objeto es actualizar la interfaz de usuario: animaciones, temporizadores, localización GPS, etc. Se hace en este método en lugar de en onCreate() para no consumir recursos de forma innecesaria hasta que realmente haya intención de mostrar la actividad.
- onResume(). Se ejecuta justo antes de que la actividad sea completamente visible. Es el sitio ideal para iniciar animaciones, acceder a recursos que se tienen que utilizar de forma exclusiva (como la cámara), etc. De esta forma no utilizamos los recursos más valiosos hasta que realmente sea necesario. Hay que tener en cuenta que aunque se ejecuta onStart(), la actividad podrá no llegar a visualizarse, por lo que no tendría sentido bloquear los recursos o activar procesos que actualizan una interfaz de usuario que nadie va a ver.
- onPause(). Se ejecuta cuando el usuario deja de poder actuar con la actividad actual por ser reemplazada con otra. Es el sitio ideal para detener todo lo que se ha activado en onResume() y liberar los recursos de uso exclusivo. También se aprovecha para guardar los cambios que no queremos que se pierdan entre ejecuciones de la aplicación. El pause() no garantiza que luego vuelva la actividad. En cualquier caso, la ejecución de este método debería ser lo más rápida posible, puesto que el usuario no podrá utilizar la nueva actividad hasta que finalice el onPause().
- onStop(). Se llama a este método cuando la actividad ha sido ocultada totalmente por otra que ya está interactuando con el usuario. Aquí se suelen destruir los procesos creados en el método onStart(), para liberar recursos y permitir que la actividad que está interactuando actualmente con el usuario pueda ir lo más fluidamente posible.
- onDestroy(). El sistema ejecuta este método cuando ya no tiene intención de ejecutar más el objeto que contiene la actividad. Esto pasa por los requerimientos de memoria que tenga el sistema o porque de manera explícita el usuario manda llamar a este método. Ya no se puede hacer otra cosa que detruir objetos, hilos y demás dejados en el onStop(). Si se quiere volver a ejecutar la actividad arrancaría un nuevo ciclo de vida.
- onRestart(). Se ejecuta cuando la actividad ha sido parada y se quiere volver a utilizar. Su uso no es tan habitual como el resto pero puede ser útil en casos donde no compensa destruir ciertos elementos en onStop() para volver a crearlos en onStart() por cuestiones de eficiencia o porque eso provocaría el reinicio no deseado de alguna aplicación (consultas a bases de datos, por ejemplo). Después de parado para volver a ejecutarse onRestart() lanzará los eventos onStart() y onResume().
Quinta aplicación. Mostrando todos los procesos
Para poder visualizar bien los procesos que
se llevan a cabo en nuestra aplicación, vamos a generar una nueva en la que
simplemente cambiaremos el código de MainActivity.java por el siguiente:
…
public class
MainActivity extends Activity {
protected void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web);
Toast.makeText(this,
"onCreate", Toast.LENGTH_SHORT).show();
}
@Override
protected void onStart() {
super.onStart();
Toast.makeText(this,
"onStart", Toast.LENGTH_SHORT).show();
}
@Override
protected void onResume() {
super.onResume();
Toast.makeText(this,
"onResume", Toast.LENGTH_SHORT).show();
}
@Override
protected void onPause() {
Toast.makeText(this,
"onPause", Toast.LENGTH_SHORT).show();
super.onPause();
}
@Override
protected void onStop() {
Toast.makeText(this,
"onStop", Toast.LENGTH_SHORT).show();
super.onStop();
}
@Override
protected void onRestart() {
super.onRestart();
Toast.makeText(this,
"onRestart", Toast.LENGTH_SHORT).show();
}
@Override
protected void onDestroy() {
Toast.makeText(this, "onDestroy",
Toast.LENGTH_SHORT).show();
super.onDestroy();
}
}
Ahora, si ejecutas la aplicación puedes observar su ciclo de vida cuando
la inicias, cuando pulsas el botón Home,
el botón Atrás, etc.
0 comments:
Publicar un comentario