Modos de lanzamiento de Activity – standard
En proyectos reales, debemos definir el modo de lanzamiento adecuado para cada Activity según nuestras necesidades.
Existen cuatro modos de lanzamiento:
standard, singleTop, singleTask y singleInstance
Podemos configurar el atributo launchMode de la Activity en AndroidManifest.xml
standard es el modo de lanzamiento por defecto
Si no lo indicamos, todas las Activities usan este modo por defecto
En este modo, cada Activity nueva se coloca en la parte superior de la pila
El sistema no revisa si esa Activity ya existe en la pila.
Cada vez que se lanza, se crea una nueva instancia de la Activity
Activity principal –> Activity normal —> abrir la activity principal (nueva)
Para esta nueva activity principal, el sistema no tiene en cuenta la instancia anterior
Ahora vamos a ver una demostración
Agregamos un botón en la activity principal. En el evento de clic de ese botón, usamos Intent para abrir otra vez la activity principal
Duda: parece que con solo pulsar atrás una vez ya salimos de la aplicación
No sabemos por qué ocurre esto
Si algún compañero encuentra la causa, compártala con todos.
Modos de lanzamiento de Activity – singleTop
Si configuramos una Activity con el modo singleTop: cuando se lance, si la Activity ya está en la cima de la pila de retroceso, se reutiliza la instancia existente y no se crea una nueva.
Vamos a probarlo. En AndroidManifest.xml ponemos el atributo launchMode de la activity principal como singleTop
Después, no importa cuántas veces pulsemos el botón, no se crean nuevas instancias de la activity principal, y el log solo se muestra una vez.
Con una sola pulsación del botón back salimos de la app Android
Pero si la Activity no está en la cima de la pila, sí se puede generar una instancia nueva
Probemos esto modificando el Intent, esta vez vamos a abrir
otra Activity, y luego desde esa segunda Activity abrimos la activity principal.
La clave es: cuando estamos en la segunda Activity, la cima de la pila no es la activity principal, así que en este caso sí se crea una nueva activity principal.
I/Choreographer: Skipped 37 frames! The application may be doing too much work on its main thread.Lenguaje del código: HTTP (http)
Problema: al pulsar back salimos al escritorio (de las dos clases anteriores)
Esto pasa porque añadimos una línea finish(); de más en el evento del botón
Log.e(TAG, this.toString()); sirve para registrar la dirección de memoria de la Activity actual
Modo singleTask
Con singleTask podemos asegurarnos de que solo exista una única instancia de esa Activity en toda la aplicación.
En cambio, singleTop solo garantiza una única instancia cuando está en la cima de la pila.
Modo singleInstance y las Tareas Task
Con este modo, el sistema crea una pila de retroceso nueva para gestionar esta Activity
Por ejemplo, tenemos tres Activities. Si asignamos launchMode=singleInstance a la segunda Activity, esta se gestiona mediante una pila de retroceso separada.
En este escenario pasamos de la primera Activity a la segunda, y luego de la segunda a la tercera
Si pulsamos back desde la tercera Activity, volvemos primero a la primera, ya que la primera y la tercera comparten la misma pila de retroceso.
Después, al pulsar back en la primera Activity, pasamos a la segunda. En ese momento la pila de la primera Activity ya está vacía, así que el sistema salta al elemento superior de otra pila de tareas de la app, es decir, la Activity 2. Si pulsamos back otra vez, regresamos al escritorio.
public void onClick(View view){
Intent it = new Intent(ActividadNormal.this,Actividad3.class);
startActivity(it);
finish();
}Lenguaje del código: JavaScript (javascript)
05-13 08:14:26.890 4746-4746/com.foxdevelop.www.lifedemo E/Actividad principal: 113
05-13 08:14:33.755 4746-4746/com.foxdevelop.www.lifedemo E/Actividad normal: 114
05-13 08:14:37.932 4746-4746/com.foxdevelop.www.lifedemo E/Tercera actividad: 113
Modos de lanzamiento de Activity