2010-07-19 22 views
33

Sugerid cómo puedo cerrar toda mi aplicación Android con un código de línea.Cerrar la aplicación para Android

+0

¿por qué se estipula que debe estar en una línea de código? Lo más probable es que tome más que eso. – atreat

Respuesta

0

Si cierra la Actividad principal usando Activity.finish(), creo que cerrará todas las actividades. MAybe puede anular la función predeterminada e implementarla de manera estática, no estoy seguro

+0

no, no es así. – jellyfish

0

No creo que pueda hacerlo en una línea de código. Intente abrir sus actividades con startActivityForResult. Como resultado, puede pasar algo como un CLOSE_FLAG, que informará a su actividad principal que su actividad infantil ha finalizado.

Dicho esto, probablemente debería leer this answer.

+0

system.exit (0) lo hace muy bien en una línea de código. Mata a toda la JVM que se dedica a ejecutar esa aplicación. –

2

simplemente llame a finish() en el método en el que desea finalizar la actividad, por ejemplo, cuando usa el método onCreate(), al final del método, simplemente agregue finish() y verá el la actividad termina tan pronto como se crea!

2

Según mi conocimiento, la función de finalización cierra solamente la pantalla mostrada actualmente.

Consulte esto example (donde vea la respuesta dada por 'plusminus'), de seguro lo ayudará a cerrar su aplicación.

-1

Ese es uno de los deseos más inútiles de los principiantes desarrolladores de Android, y desafortunadamente parece ser muy popular. ¿Cómo se define "cerrar" una aplicación de Android? Ocultar su interfaz de usuario? Interrumpir el trabajo de fondo? Deja de manejar transmisiones?

Las aplicaciones de Android son un conjunto de módulos, se incluyen en una .apk y se exponen al sistema a través de AndroidManifest.xml. Las actividades se pueden organizar y reorganizar a través de diferentes apilamientos de tareas, y finalizar() o cualquier otro que se aleje de una sola actividad puede significar cosas totalmente diferentes en diferentes situaciones. Una sola aplicación puede ejecutarse dentro de múltiples procesos, por lo que matar un proceso no necesariamente significa que no habrá código de aplicación en ejecución. Y finalmente, el sistema puede llamar a BroadcastReceivers en cualquier momento, recreando los procesos necesarios si no están en ejecución.

Lo principal es que usted no necesita para detener/matar/cerrar/lo que sea su aplicación a través de una sola línea de código. Hacerlo es una indicación de que te perdiste un punto importante en el desarrollo de Android. Si por alguna extraña razón tiene que hacerlo, debe finalizar() todas las actividades, detener todos los servicios y desactivar todos los BroadcastReceivers declarados en AndroidManifest.xml. Esa no es una sola línea de código, y quizás lanzar la Actividad que desinstala su propia aplicación hará el trabajo mejor.

+27

No creo que esta sea una respuesta útil. Él no pidió su opinión (lo cual no es del todo correcto). Un ejemplo de por qué tendría que hacer esto es si tiene un Controlador de excepciones no detectadas que envía la excepción a un servidor web y luego cierra la aplicación después de informar al usuario de lo que se debe hacer. – user1132959

+2

Esto no es un deseo inútil. Android deja las aplicaciones terminadas() colgadas en la memoria durante semanas o días si no están realmente cerradas, usando la memoria. Como regla general, cada aplicación se ejecuta completamente dentro de su propia máquina virtual Java, que es un proceso único de Linux, que se ejecuta con su propia identificación de usuario. Cuando muere la JVM, la aplicación está 100% cerrada. System.exit (0) termina la JVM y la aplicación. Activity.finish() cierra por completo la aplicación y la deja y su JVM ejecutándose en la memoria. –

+0

No es cierto que cada aplicación se ejecute completamente en su propio proceso: cada aplicación se ejecuta en al menos un proceso, pero puede tener más. El sistema operativo Android no libera inmediatamente la memoria de la aplicación una vez que la interfaz de usuario se ha ido por varias buenas razones. Solo necesita actualizar su conocimiento sobre Android antes de adaptar dichos métodos en su programación: http://developer.android.com/guide/components/processes-and-threads.html#Processes – ognian

1

Antes de hacerlo por favor lea este otro question también:

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

Este código matar el proceso de OS Utilizando este código perturben el sistema operativo.Por lo que recomiendo que use el código de abajo

this.finish(); 
Intent intent = new Intent(Intent.ACTION_MAIN); 
intent.addCategory(Intent.CATEGORY_HOME); 
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent); 
76

Sí - ¿Por qué, entonces, ¿cómo (tipo de):

Respuesta corta:

System.exit(0); 

Esta muy bien y limpiamente termina todo el java máquina que está dedicada a ejecutar la aplicación. Sin embargo, debes hacerlo desde la actividad principal, de lo contrario, Android puede reiniciar tu aplicación automáticamente. (Probado esto en Android 7.0)

detalles y una explicación de por qué esto es una buena pregunta y un programador puede tener una razón muy legítima para poner fin a su aplicación de esta manera:

Realmente no veo la ganancia en hablando con dureza a alguien que está buscando una manera de terminar su aplicación.

Good es un recordatorio amigable para principiantes de que en Android no tiene que preocuparse por cerrar su aplicación, pero algunas personas realmente quieren terminar su aplicación aunque sepan que no tienen que hacerlo. y su pregunta de cómo hacerlo es una pregunta legítima con una respuesta válida.

Quizás muchas personas vivan en un mundo ideal y no se den cuenta de que hay un mundo real donde la gente real está tratando de resolver problemas reales.

El hecho es que incluso con Android, sigue siendo una computadora y esa computadora todavía está ejecutando código, y es perfectamente comprensible por qué alguien realmente desea salir de su "aplicación" (es decir, todas las actividades y recursos perteneciente a su aplicación)

Es cierto que los desarrolladores de Google diseñaron un sistema en el que creían que nadie necesitaría salir de su aplicación. ¡Y tal vez el 99% del tiempo tienen razón!

¡Pero una de las cosas asombrosas de permitir que millones de programadores escriban código para una plataforma es que algunos de ellos intentarán llevar la plataforma al límite para hacer cosas increíbles! - ¡Incluyendo cosas que los desarrolladores de Android nunca soñaron!

Hay otra necesidad de poder cerrar un programa, y ​​eso es para solucionar problemas. Eso es lo que me trajo a este hilo: estoy aprendiendo cómo utilizar la función de entrada de audio para hacer DSP en tiempo real.

Ahora, no olvide que dije lo siguiente: bien sé que cuando todo esté bien hecho, no necesitaré matar a mi aplicación para restablecer la interfaz de audio.

PERO: ¡Recuerde, las aplicaciones perfectas no comienzan como aplicaciones perfectas! Comienzan como aplicaciones que apenas funcionan y crecen hasta convertirse en aplicaciones ideales.

Así que lo que encontré fue que mi pequeña aplicación de prueba de osciloscopio de audio funcionaba muy bien hasta que presioné el botón Inicio de Android. Cuando volví a lanzar mi aplicación de osciloscopio, ya no había audio entrando.

Al principio me gustaría ir a Settings->Applications->Manage Applications->AppName->Force Stop.

(Tenga en cuenta que si el proceso de Linux actual no está funcionando, el botón Forzar detención se desactivará. Si está activado el botón, entonces el proceso de Linux todavía está funcionando!)

Luego pude volver a ejecutar mi aplicación y funcionó de nuevo.

Al principio, solo estaba usando dividir por cero para bloquearlo, y funcionó muy bien. Pero decidí buscar una mejor manera, ¡que me trajo aquí!

Así que aquí está la manera que probé y lo que descubrí:

Antecedentes: Android se ejecuta en Linux. Linux tiene procesos e ID de procesos (PID) como lo hace Windows, solo que mejor. Para ver qué procesos se están ejecutando en su android (con él conectado en el USB y todo) ejecute adb shell top y obtendrá una lista de actualización de todos los procesos que se ejecutan en el Linux bajo el android.

Si ha Linux en su PC, así, puede escribir

adb shell top | egrep -i '(User|PID|MyFirstApp)' --line-buffered

para obtener sólo los resultados para su aplicación llamada MyFirstApp. Puede ver cuántos procesos de Linux se están ejecutando con ese nombre y qué cantidad de energía de la CPU están consumiendo.

(igual que la lista de administrador de tareas/procesos en Windows)

O si desea ver sólo las aplicaciones en ejecución:

adb shell top | egrep -i '(User|PID|app_)' --line-buffered

También puede matar a cualquier aplicación en su dispositivo mediante la ejecución adb shell kill 12345 donde 12345 es su número PID.

Según lo que puedo decir, cada aplicación de un único subproceso solo utiliza un único proceso de Linux.

Así que lo que descubrí fue que (por supuesto) si acabo de activar la opción de inicio de Android, mi aplicación continúa ejecutándose. Y si uso el Activity.finish(), aún deja el proceso en ejecución. Dividir por cero definitivamente termina el proceso de Linux que se está ejecutando. Asesinar el PID desde dentro de la aplicación parece ser el mejor hasta ahora que he encontrado, al menos con fines de depuración.

inicialmente resuelto mi necesidad de matar a mi aplicación mediante la adición de un botón que provocaría una división por cero, como este en mi MainActivity.java:

public void exit(View view) 
{ 
    int x; 
    x=1/0; 
} 

Luego, en mi sección de archivos XML diseño para ese botón acabo establece el android: onClick = "exit".

Por supuesto, dividir por cero es complicado porque siempre muestra "Esta aplicación se detuvo ..." o lo que sea.

Entonces me trataron el acabado, así:

public void exit(View view) 
{ 
    finish(); 
} 

Y eso hizo que la aplicación desaparece de la pantalla, pero aún se ejecuta en segundo plano.

Luego probé:

public void exit(View view) 
{ 
     android.os.Process.killProcess(android.os.Process.myPid()); 
} 

Hasta el momento, esta es la mejor solución que he probado.

ACTUALIZACIÓN: Este es el mismo que el anterior, ya que al instante finaliza el proceso de Linux y todas las discusiones para la aplicación:

public void exit(View view) 
{ 
     System.exit(0); 
} 

En el acto se hace un buen salida completa de la rosca en cuestión sin que indica al usuario que la aplicación se colgó.

Se liberará toda la memoria utilizada por la aplicación. (Nota: en realidad, puede establecer parámetros en su archivo de manifiesto para hacer que diferentes subprocesos se ejecuten en diferentes procesos de Linux, por lo que se vuelve más complicado).

Al menos para pruebas rápidas y sucias, si es absolutamente necesario que lo sepa que el hilo en realidad se ha eliminado por completo, el proceso de matar lo hace muy bien. Sin embargo, si está ejecutando varios hilos, puede que tenga que matar a cada uno de ellos, probablemente desde dentro de cada hilo.

EDIT: Aquí es un gran enlace para leer sobre el tema: http://developer.android.com/guide/components/fundamentals.html En él se explica cómo cada aplicación se ejecuta en su propia máquina virtual, y cada máquina virtual se ejecuta bajo su propia ID de usuario.

Aquí hay otra gran enlace que explica cómo (a menos que se especifique lo contrario en el manifiesto) una aplicación y todos sus hilos se ejecuta en un solo proceso de Linux: http://developer.android.com/guide/components/processes-and-threads.html

Por lo tanto, como regla general, una aplicación es realmente un programa en ejecución en la computadora y la aplicación realmente se puede matar completamente, eliminando todos los recursos de la memoria al instante.

(Por instante me refiero a lo antes posible - con una antelación siempre que se necesite el carnero.)

PS: ¿Se ha preguntado por qué vas a contestar su teléfono Android o lanzar su aplicación favorita y se congela por un segundo? ¿Alguna vez reinicias porque te cansas de eso? Probablemente se deba a todas las aplicaciones que ejecutó la semana pasada y pensó que se dio por vencido, pero sigue usando la memoria. ¡El teléfono los mata cuando necesita más memoria, causando un retraso antes de cualquier acción que quisieras hacer!

Actualización para Android 4/Gingerbread: se aplica lo mismo que en el caso anterior, excepto cuando una aplicación se cierra o falla y todo el proceso de su máquina virtual java muere, todavía aparece ejecutándose en el administrador de la aplicación y usted todavía tiene el Opción "forzar cierre" o lo que sea. 4.0 debe tener una lista independiente de las aplicaciones que cree que se están ejecutando en lugar de verificar si realmente se está ejecutando una aplicación.

+3

Oye, No tiene muchos puntos aquí, pero quería agradecerle esta respuesta larga y útil. "No es necesario que hagas esto" (actualmente la respuesta principal) es más o menos inútil sin una explicación más. Su respuesta realmente explica exactamente lo que necesitaba. –

+0

No hay necesidad de ningún código de fantasía, simplemente intente 'System.exit (0)' para salir de una aplicación de Android. Este es básicamente el comando de Java soportado/portado por Android. Después de todo, Android es básicamente Java y algunas otras cosas más. :) – ChuongPham

+0

¡Sí! ¡Gracias! System.exit (0) es definitivamente la mejor manera. Había escrito la mayoría de las anteriores antes de encontrar System.exit(), pero lo dejé para ayudar a las personas a entender mejor la situación. ¡Gracias! –

3

Puede cerrar su Aplicación de Android llamando a System.exit (0).

+3

Esto es correcto. Cada aplicación se ejecuta en su propia máquina virtual Java, que es un único proceso/tarea de Linux. System.exit (0) finaliza la máquina virtual de Java que ejecuta esa aplicación y la cierra por completo. De lo contrario, la JVM y la aplicación permanecerán en la memoria durante días o semanas. –

+0

Esta debería ser la primera respuesta. –

1

no es una solución de una sola línea de código, pero es bastante fácil:

Actividad subclase, a continuación, anular y añadir acabado() con el método onPause()

esta manera, la actividad se ha ido una vez entra en segundo plano, por lo tanto, la aplicación no guardará una pila de actividades, puede finalizar() la actividad actual y ¡la aplicación ya no está!

0

La respuesta depende de lo que quiere decir con "cerrar aplicación". En términos de android, se trata de una "actividad" o un grupo de actividades en una orden temporal/ancestral llamada "tarea".

actividad Fin: sólo llame finish()

tarea final:

  1. clara actividad de tarea-pila
  2. navegar a erradicar la actividad
  3. luego llamar acabado en él.

Esto va a terminar toda la "tarea"

Cuestiones relacionadas