2011-01-24 15 views
29

Obtuve una actividad que cuando comienza, carga una imagen de internet. En un esfuerzo por ahorrar memoria, cuando la actividad se deja presionada por el botón Atrás, quiero que la actividad elimine todos los datos, es decir, que elimine todas las cadenas e imágenes que contiene. Pensé que la mejor manera de hacerlo era simplemente matar la actividad.¿Cómo elimino una actividad cuando se presiona el botón Atrás?

Bueno, no puedo entender la devolución de llamada para cuando se presiona el botón Atrás. Por lo tanto, he intentado utilizar las devoluciones de llamada onPause() y onStop() para la tarea, pero ambas formas fuerzan el cierre de mi aplicación. Aquí está el código:

public void onPause() { 
    this.finish(); 
} 
public void onStop() { 
    finish(); 
} 

He intentado varias variaciones de esto, pero ninguno de ellos pareció funcionar. ¿Algunas ideas?

+0

¿qué está buscando exactamente? Para terminar la actividad actual en la parte posterior? Botón –

Respuesta

36

agregar esto a su actividad

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) 
{ 
    if ((keyCode == KeyEvent.KEYCODE_BACK)) 
    { 
     finish(); 
    } 
    return super.onKeyDown(keyCode, event); 
} 
+1

¿Cuál es el punto? Al presionar el botón Atrás automáticamente bajará la pila de actividades. 'finish()' solo se asegura de que no puedas volver atrás. (Dicho esto, la pregunta es ciertamente vaga.) – EboMike

+2

por supuesto, pero la actividad no está segura al presionar el botón Atrás, entonces matar el final es importante y eso es lo que se pregunta en cuestión, pero desde que se libera la memoria se hace automáticamente por OS – ingsaurabh

+2

Absolutamente no. Si la actividad no está en frente, puede ser recuperada por el sistema operativo. Terminado o no. – EboMike

4

Bueno, si se estudia la estructura de cómo funciona el ciclo de vida de la aplicación, here, a continuación, llegará a saber que onPause() se llama cuando otro ganancias de la actividad del foco y se llama al onStop() cuando la actividad ya no es visible.

Por lo que he aprendido aún, puede llamar al finish() solo desde la actividad que está activa y/o tiene el foco. Si llama al finish() desde el método onPause(), significa que lo está llamando cuando la actividad ya no está activa. por lo tanto, se lanza una excepción.

Cuando llame al finish() desde onStop(), la actividad se enviará a segundo plano y, por lo tanto, ya no estará visible, esta excepción.

Al presionar el botón back, se invoca onStop().

Lo más probable es que Android automáticamente haga por usted lo que usted actualmente desea hacer.

6

En primer lugar, finish() no destruye su proceso y libera la memoria. Simplemente elimina la actividad de la pila de actividades. Tendría que matar el proceso, que se responde en un montón de preguntas (ya que esto se hace varias veces).

Pero la respuesta correcta es - No lo hagas. el sistema operativo Android liberará automáticamente la memoria cuando necesite memoria. Al no liberar memoria, su aplicación se iniciará más rápido si el usuario vuelve a ella.

Por favor, see here para una excelente reseña sobre el tema.

+7

Si la actividad utiliza muchos recursos, ¿por qué no matarlo desde el interior de la aplicación en lugar de esperar al GC? Eso es todo un proceso adicional que tendría que atravesar, por lo tanto, disminuyendo la velocidad del teléfono. La buena administración de la memoria está haciendo todo lo posible para administrarla dentro del programa mismo. Es por eso que la mayoría de los lenguajes de programación administrados e ide's introducen automáticamente el código de auto limpieza en el programa, y ​​también es la razón por la cual está dando el ciclo de vida, de modo que puede administrar la memoria lo mejor que pueda desde su aplicación. – Shaun

+1

Shaun tiene razón, la buena administración de la memoria está haciendo todo lo posible para administrarla dentro del programa. – dns

61

Anulación simple onBackPressed Método:

@Override 
    public void onBackPressed() { 
      super.onBackPressed(); 
      this.finish(); 
    } 
13
public boolean onKeyDown(int keycode, KeyEvent event) { 
    if (keycode == KeyEvent.KEYCODE_BACK) { 
     moveTaskToBack(true); 
    } 
    return super.onKeyDown(keycode, event); 
} 

Mi aplicación se cerró con código de seguridad.

+0

está funcionando, gracias – Mohsen

+0

Its Working pero la aplicación está abierta en la misma página siempre que no se elimine la aplicación –

+0

, pero quiere iniciar la aplicación en la actividad del iniciador –

Cuestiones relacionadas