No es un bug, es una característica no documentada

martes, 3 de noviembre de 2015

Programación multimedia. Procesos

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 comentarios:

Publicar un comentario