2010-07-13 13 views
15

Tengo mi actividad y al presionar el botón "Salir", llamo Activity.finish(). Esto efectivamente cierra mi aplicación.Cómo matar mi propia actividad: de la manera difícil

El problema: El proceso de Dalvik de mi aplicación todavía está dando vueltas como un zombi en el fondo. Parece que esto es normal ya que otras aplicaciones hacen lo mismo. Incluso el ejemplo de hola-mundo se queda en la memoria ...

Podría vivir con esto, pero desafortunadamente este comportamiento hace que el desarrollo de mi aplicación sea un problema. Tengo un servicio remoto conectado a mi Actividad, y este servicio no se descargará hasta que mi Actividad se descargue (lo cual, como se dijo, nunca ocurre).

Todo de alguna manera se mantiene vivo sin una buena razón.

¿Cómo puedo realmente eliminar mi Actividad de la memoria?

Estoy buscando algo así como la llamada Activity.finish_and_kill_my_process_please() o algo similar.

Respuesta

8

por lo que tengo a mi actividad, y al pulsar un botón "Finalizar" Debo llamar Activity.finish(). Esto efectivamente cierra mi aplicación.

Please don't do this.

El Dalvik-proceso de mi solicitud todavía está dando vueltas como un zombi en fondo.

El proceso se guarda en un caché, para su posible reutilización por parte de Android. Puede ignorarlo con seguridad.

que tienen un servicio remoto conectado a mi actividad, y este servicio lo hará no de descarga hasta que mi Actividad descarga el (que como se ha dicho nunca lo hace).

es probable que haya un error en la aplicación, tales como llamar startService() y no llamar stopService(), o llamando bindService() y no llamar unbindService().

6

intente utilizar el método killBackgroundProcesses:

ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 
activityManager.killBackgroundProcesses("name.of.your.package"); 

Usted tendrá que añadir el permiso KILL_BACKGROUND_PROCESSES a su archivo AndroidManifest.xml.

+0

Ok, parece que este método ya no es parte de la clase ActivityManager ?? – bugzy

+0

Hay una nueva API para Android 2.2 Froyo pero esta es una muy mala idea. Los permisos están marcados como PELIGROSOS y los usuarios verán que tu aplicación tiene la capacidad de matar a otras aplicaciones. – Tom

+0

Si bien la finalización del proceso de una aplicación casi nunca es una buena idea fuera de las pruebas poco conocidas durante el desarrollo, esta es una forma innecesariamente indirecta de hacerlo. Un proceso simplemente puede salir() o suicidarse: no es necesario que solicite al ActivityManager que lo haga. –

24
  1. Llamar terminar(); en el botón haga clic en
  2. añadir esta línea a OnDestroy método:

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

public void onDestroy() { 
     super.onDestroy(); 
     android.os.Process.killProcess(android.os.Process.myPid()); 
    }  
+8

Para una aplicación lanzada KillProcess() no es una buena idea. Pero para la fase de desarrollo (acelerar la finalización de una aplicación con fines de depuración) esto es un salvavidas. +1. – an00b

+0

Definitivamente útil durante el desarrollo (para uso temporal) – Diljeet

+1

Esto ha sido útil para ayudarme a descargar una lib nativa :-) – Miquel

3

Al matar el proceso se puede detener la aplicación completely.from la última pantalla en la parte posterior pulse el botón se puede matar el proceso:

public void onBackPressed() { 
     super.onBackPressed(); 
     int pid = android.os.Process.myPid(); 
     android.os.Process.killProcess(pid); } 
0

Al utilizar el ActivityManager podemos cerrar la otras aplicaciones también

private ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE); 
am.restartPackage("com.jimmy.appToBeClosed"); 

utilizar el código anterior debe tener los permisos en android.permission.RESTART_PACKAGE archivo de manifiesto.

+0

restartPackage ahora está en desuso. use killBackgroundProcesses en su lugar. – rfinz

4

Bueno, si no sólo la actividad, sino también la aplicación que desea terminar, se puede utilizar

System.exit(0)

La gente dice que está en desuso o mal ejemplo, pero, bueno, es puro Java y funciona ...

+0

¿Sabes por qué la gente dice esas cosas? ¿Tiene algo que ver con cómo la aplicación "vive" dentro de Android O.S.? Esto es tentador de usar en una de mis aplicaciones ... pero me gustaría saber primero la teoría detrás del desaliento. – snapfractalpop

+2

Bueno, creo que lo dicen porque Android puede administrar aplicaciones; así que no deberíamos meter la nariz. Pero yo digo que esto es una mierda: si es mi aplicación, ¿quién más que yo puede saber cuándo terminarla? :) –

0

System.exit() descarga el instante máquina virtual entera con todas las bibliotecas nativas, servicios, etc

1

similares a la System.exit (0) en el lado de Java, también puede llamar a un nativo método durante onD estroy que llama a exit (0) en el lado C/C++. Esto parece forzar a la lib a salir por completo. ¡Me funciona!

Cuestiones relacionadas