2009-12-29 3 views
26

Tengo una actividad y llamo al método finish() y la actividad no se borra de la memoria.El método android finish() no borra la aplicación de la memoria

Después de llamar a finish(), veo que el método onDestroy() se ejecuta con éxito (y borro todas mis variables y esas cosas allí).

¿Debería borrarse de la memoria o de cómo funciona el android? Según entiendo, el ciclo de vida de la actividad ha terminado.

Y si mantiene la aplicación en la memoria para que funcione más rápido la segunda vez que el usuario la usa, ¿qué tipo de objetos puedo dejar en la memoria para volver a usar? Si entiendo correctamente, se supone que debo borrar todo en Destroy.

+0

"Tengo una actividad y llamo al método finish() y la actividad no se borra de la memoria". - cómo, * precisamente *, ¿has determinado esto? – CommonsWare

+2

Si usa DDMS de eclipse, puede depurar para asegurarse de que se ejecuta a través de onDestroy() y después de eso, aún puede ver el proceso en el dispositivo e incluso puede ver el tamaño de almacenamiento dinámico que se toma, y ​​puede volcar la memoria analizar. Si no me equivoco, esto significa que todavía está en la memoria, ¿correcto? –

Respuesta

31

Android mantiene los procesos por si el usuario desea reiniciar la aplicación, esto hace que la fase de inicio sea más rápida. El proceso no hará nada y si la memoria necesita ser recuperada, el proceso será eliminado. No se preocupe por él :)

+1

¿Esto también se aplica a las "subactividades", es decir, si no es la última actividad abierta en mi aplicación? Digamos: si abro la actividad B de la actividad A, entonces B.finish(), Android eventualmente mantendría B en la memoria y eventualmente también vería B en mi volcado de hprof (en caso de que Android no necesite reclamar memoria para en otra parte)? –

+0

Sí, la actividad B seguirá siendo memoria. La actividad B solo se eliminará si Android necesita memoria para otra cosa. – ChuongPham

+0

"¿No te preocupes por enviar la aplicación al fondo en lugar de eliminarla por completo de la memoria?" ¿Eres un programador serio? ¿Qué tal el Banco u otras aplicaciones frágiles de seguridad? – TomeeNS

6

Una vez que se llama a onDestroy(), su actividad está condenada al fracaso. Período.

Dicho esto, el proceso (y, por lo tanto, el espacio de direcciones) asignado a su aplicación aún puede estar siendo utilizado por otra parte de su aplicación, otra actividad o servicio. También es posible que su proceso esté vacío y que el sistema operativo aún no haya logrado reclamarlo; no es instantáneo

Ver el documento de proceso del ciclo de vida para más información:
http://developer.android.com/reference/android/app/Activity.html#ProcessLifecycle

todos modos, si se relanza su actividad, que tendrá que ir a través de toda la secuencia de arranque de nuevo, comenzando con onCreate(). No asuma que cualquier cosa puede ser reutilizada implícitamente.

+0

Creo que esto no es totalmente cierto. No creo que la Actividad sea fatal, porque hay formas de perder memoria y entonces la Actividad vivirá para siempre. –

+0

Incluso si una actividad pierde memoria, cuando el SO mata el proceso, la memoria será recuperada. Al igual que cuando finaliza un proceso en un sistema operativo de escritorio. –

1

Según this presentación del Google I/O 2008, en Finalizar debe también hacer que el proceso a matar, pero me escribió una aplicación rápida para probar esto y en Android 1.5 lo hace no.

Como dijo Romain (quien por cierto es un ingeniero de UI Toolkit para Android), su proceso simplemente se quedará allí sin hacer nada, así que no hay nada de qué preocuparse.

10

Trate de usar

System.exit (0);

+0

que me ahorra tiempo :) – HarrY

4

Si necesita cerrar la aplicación desde la subactividad, le sugiero que la haga de la siguiente manera: 1) desde la actividad Una actividad de llamada B como startActivityForResult (intention, REQUEST_CODE);

Intent intent = new Intent() 
      .setClass(ActivityA.this, ActivityB.class); 
      startActivityForResult(intent, REQUEST_CODE); 

2) en la actividad A se debe añadir método:

protected void onActivityResult(int requestCode, int resultCode, 
     Intent data) { 
    if (requestCode == REQUEST_CODE) { 
     if (resultCode == RESULT_CLOSE_APPLICATION) { 
      this.finish(); 
     } 
    } 
} 

3) en la actividad de acabado llamada B:

this.setResult(RESULT_CLOSE_APPLICATION); 
this.finish(); 
1

como una solución rápida puede utilizar el folowing para matar su aplicación:

android.os.Process.killProcess(android.os.Process.myPid()); 

Pero yo no recomendaría d esto para aplicaciones comerciales porque va en contra de cómo funciona el sistema de gestión de memoria de Android.

23

La mejor manera es primero usar finish() y luego usar System.exit(0) para borrar las variables estáticas. Le dará un poco de espacio libre.

Muchas aplicaciones dejan los procesos de trabajo y las variables lo que me enoja. Después de 30 minutos de usar la memoria está llena y tengo que ejecutar el Administrador de tareas - Lvl 2 borrar la memoria

No es cierto que se trata de problemas que he probado durante más de 3 años en mis aplicaciones. Nunca se cuelgue o reinicie después de usar Exit()

+2

Esto también funciona para mí . Tuve una situación en la que estaba presionando el botón Atrás para salir de la aplicación, por comportamiento normal, y estaba dejando memoria. La próxima vez que comencé, la memoria se acaba de acumular, y si lo hacía unas cinco veces, me quedaba sin montón (24 MB en el dispositivo de prueba). finish() solo no estaba haciendo el trabajo. Sospecho que la actividad de Splash que utilizo para que el usuario sepa que estaremos allí puede haber impedido de algún modo que la memoria se recupere al salir. Parece menos hábil usar una herramienta tan tosca, pero cuando cierras la aplicación, ¿cuál es la diferencia? – Carl

+0

Gracias, esta respuesta resolvió mi problema. –

+2

Mi aplicación de juego usa 225 MB en la ejecución inicial. Después de usar finish() y reiniciar, usa 400MB por segunda vez, corriendo significativamente más lento (mi Samsung Galaxy Tab S2 tiene un montón de 524M). En otros dispositivos menos apilados simplemente se bloquea con un error de "falta de memoria" en la segunda ejecución. El uso de 'System.exit (0)' después de 'finish()' parece solucionar esto. Noto que 'finish()' no detiene inmediatamente la ejecución del código, ya que 'System.exit (0)' todavía se alcanza cuando se coloca después de 'finish()'. Sin embargo, 'System.exit (0)' parece detener el código ejecutado en su línea. – Androidcoder

Cuestiones relacionadas