Cómo salir de la aplicación de Android mediante programación

He encontrado algunos códigos para salir de una aplicación de Android mediante programación. Al llamar a cualquiera de los siguientes códigos en onDestroy (), ¿dejará la aplicación por completo?

  1. System.runFinalizersOnExit(true)
    (O)
  2. android.os.Process.killProcess(android.os.Process.myPid());

No quiero ejecutar mi aplicación en segundo plano después de hacer clic en botón Salir. Pls me sugieren que puedo utilizar cualquiera de estos códigos para salir de mi aplicación? Si es así, ¿qué código puedo usar? ¿Es buena forma de salir de la aplicación en Android?

21 Solutions collect form web for “Cómo salir de la aplicación de Android mediante programación”

Desde api 16 puede utilizar el método finishAffinity, que parece estar bastante cerca de cerrar todas las actividades relacionadas por su nombre y la descripción de javadoc:

This.finishAffinity ();

Termine esta actividad así como todas las actividades inmediatamente debajo de ella en la tarea actual que tengan la misma afinidad. Esto suele utilizarse cuando una aplicación puede iniciarse en otra tarea (como desde un ACTION_VIEW de un tipo de contenido que entiende) y el usuario ha utilizado la navegación ascendente para cambiar de la tarea actual a su propia tarea. En este caso, si el usuario ha navegado hacia abajo en cualquier otra actividad de la segunda aplicación, todas ellas deberían eliminarse de la tarea original como parte del conmutador de tareas.

Tenga en cuenta que este acabado no le permite entregar resultados a la actividad anterior y se producirá una excepción si está intentando hacerlo.

Desde api 21 puede utilizar un comando muy similar

FinishAndRemoveTask ();

Finaliza todas las actividades de esta tarea y las elimina de la lista de tareas recientes.

 getActivity().finish(); System.exit(0); 

Esta es la mejor manera de salir de tu aplicación. !!!

La mejor solución para mí.

Por favor, piense realmente duro si necesita matar la aplicación: ¿por qué no dejar que el sistema operativo averiguar dónde y cuándo liberar los recursos?

De lo contrario, si está absolutamente seguro, utilice

 finish(); 

Como reacción al comentario de @dave appleton: Primero lee el combo de pregunta / respuesta grande @gabriel publicado: ¿Es dejar de fumar una aplicación mal vista?

Ahora suponiendo que tenemos que, la pregunta aquí todavía tiene una respuesta, siendo que el código que necesita si está haciendo algo con dejar de fumar es finish() . Obviamente, usted puede tener más de una actividad, etc, etc, pero eso no es el punto. Vamos a correr por algunos de los casos de uso

  1. ¿Quieres dejar que el usuario abandone todo debido al uso de la memoria y "no se ejecuta en segundo plano?" Deje que el usuario detenga ciertas actividades en segundo plano, pero deje que el sistema operativo destruya cualquier recurso innecesario.
  2. ¿Quieres que un usuario no vaya a la actividad anterior de tu aplicación? Bueno, ya sea configurarlo para que no, o necesita una opción adicional. Si la mayor parte del tiempo la actividad de back = previous-works, ¿no el usuario sólo presionar a casa si él / ella quiere hacer otra cosa?
  3. Si necesita algún tipo de restablecimiento, puede averiguar si / cómo / etc se quitó su aplicación y si su actividad se vuelve a enfocar, puede actuar sobre eso, mostrando una nueva pantalla en lugar de reiniciar donde estaba.

Así que al final, por supuesto, finish() no mata everthing, pero sigue siendo la herramienta que necesita, creo. Si hay un usecase para "matar todas las actividades", no lo he encontrado todavía.

No hay solicitud de dejar de fumar en android , SampleActivity.this.finish (); Terminará la actividad actual.

Cuando cambie de una actividad a otra, termine la anterior

 Intent homeintent = new Intent(SampleActivity.this,SecondActivity.class); startActivity(homeintent); SampleActivity.this.finish(); 

Creo que la aplicación debe ser matar en algunos casos. Por ejemplo, hay una aplicación que se puede utilizar sólo después de iniciar sesión. La actividad de inicio de sesión tiene dos botones, 'inicio de sesión' y 'cancelar'. Al hacer clic en el botón "cancelar", definitivamente significa "finalizar la aplicación". Nadie quiere que la aplicación viva en segundo plano. Así que estoy de acuerdo en que algunos casos necesitan cerrar la aplicación.

No estoy seguro de si esto es mal visto o no, pero así es como lo hago …

Paso 1 – Normalmente tengo una clase que contiene métodos y variables a los que quiero acceder globalmente. En este ejemplo lo llamaré la clase "App". Cree una variable de actividad estática dentro de la clase para cada actividad que tenga su aplicación. A continuación, cree un método estático denominado "close" que ejecutará el método finish() en cada una de esas variables de Activity si no son null . Si tiene una actividad principal / principal, ciérrela por última vez:

 public class App { //////////////////////////////////////////////////////////////// // INSTANTIATED ACTIVITY VARIABLES //////////////////////////////////////////////////////////////// public static Activity activity1; public static Activity activity2; public static Activity activity3; //////////////////////////////////////////////////////////////// // CLOSE APP METHOD //////////////////////////////////////////////////////////////// public static void close() { if (App.activity3 != null) {App.activity3.finish();} if (App.activity2 != null) {App.activity2.finish();} if (App.activity1 != null) {App.activity1.finish();} } } 

Paso 2 – en cada una de sus actividades, anule los onStart() y onDestroy() . En onStart() , establezca la variable estática en su clase App igual a " this ". En onDestroy() , establezca igual a null . Por ejemplo, en la clase "Actividad1":

 @Override public void onStart() { // RUN SUPER | REGISTER ACTIVITY AS INSTANTIATED IN APP CLASS super.onStart(); App.activity1 = this; } @Override public void onDestroy() { // RUN SUPER | REGISTER ACTIVITY AS NULL IN APP CLASS super.onDestroy(); App.activity1 = null; } 

Paso 3: cuando desee cerrar su aplicación, simplemente llame a App.close() desde cualquier lugar. ¡Todas las actividades instanciadas se cerrarán! Puesto que solo estás cerrando actividades y no matando a la aplicación en sí (como en tus ejemplos), Android es libre de hacerse cargo de allí y hacer cualquier limpieza necesaria.

Una vez más, no sé si esto sería mal visto por cualquier razón. Si es así, me encantaría leer comentarios sobre por qué es y cómo se puede mejorar!

 public void quit() { int pid = android.os.Process.myPid(); android.os.Process.killProcess(pid); System.exit(0); } 

Es mejor usar finish() si estás en Activity , o getActivity().finish() si estás en el Fragment .

Si desea salir de la aplicación completamente, utilice:

 getActivity().finish(); System.exit(0); 

Creo que lo que buscas es esto

 activity.moveTaskToBack(Boolean nonRoot); 

Depende de lo rápido que quiera cerrar su aplicación.

Una manera segura de cerrar su aplicación es finishAffinity ();

Se cierra aplicación después de todos los procesos de procesamiento terminado. Esto puede necesitar algún tiempo. Si cierra su aplicación de esta manera y la reinicia después de un breve período de tiempo, es posible que la nueva aplicación se ejecute en el mismo proceso. Con todos los procesos no terminados y objetos singleton de la antigua aplicación.

Si desea estar seguro de que su aplicación está cerrada, utilice System.exit (0);

Esto cerrará su aplicación de inmediato. Pero es posible que dañes los archivos que tu aplicación tiene abiertos o que una edición en las preferencias compartidas no termina. Así que usar esto con cuidado.

Si utiliza el watchdog en combinación con una tarea de ejecución larga, puede ver las influencias de los diferentes métodos.

 new ANRWatchDog(2000).setANRListener(new ANRWatchDog.ANRListener() { public void onAppNotResponding(ANRError error) { MainActivity.this.finishAffinity(); System.exit(0); } }).start(); for(int i = 0; i < 10; ++i){ --i; } 

Esto mata tu aplicación después de 2 segundos sin mostrar un diálogo ANR o algo así. Si quita System.exit (0) , ejecute este código y reinicie la aplicación después de que se cierre, experimentará un comportamiento extraño porque el bucle sin fin sigue en ejecución.

Puede utilizar finishAndRemoveTask () de la API 21

Public void finishAndRemoveTask ()

Finaliza todas las actividades de esta tarea y las elimina de la lista de tareas recientes.

¿Es dejar de fumar una aplicación mal vista? . Ir a través de este enlace. Responde a su pregunta. El sistema hace el trabajo de matar una aplicación.

Supongamos que tiene dos actividades A y B. Navega de A a B. Cuando hace clic en el botón Atrás, su actividad B se extrae del backstack y se destruye. Actividad anterior en la actividad A de la pila trasera se centra.

Usted debe dejarlo al sistema para decidir cuándo matar la aplicación.

Public void finish()

Llame a esto cuando su actividad está terminada y debe cerrarse.

Supongamos que usted tiene muchas actividades. Puede utilizar la barra de acción. Al hacer clic en el icono de inicio naviagate a MainActivity de su aplicación. En MainActivity haga clic en el botón Atrás para salir de la aplicación.

La solución correcta y exacta para salir de la aplicación en el botón de clic está utilizando el siguiente código:

// En el botón Atrás evento presionado

 public void onBackPressed() { moveTaskToBack(true); finish(); } 

FinishAffinity ();

System.exit (0);

Si va a utilizar sólo finishAffinity (); Sin System.exit (0); Su aplicación se cerrará, pero la memoria asignada seguirá siendo en uso por su teléfono, así que … si quieres un limpio y realmente dejar de la aplicación, utilice ambos.

Este es el método más simple y funciona en cualquier lugar, salir de la aplicación de verdad, usted puede tener una gran cantidad de actividad abierta todavía dejar todo sin ningún problema.

Ejemplo en un clic de botón

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

O si desea algo agradable, ejemplo con un cuadro de diálogo de alerta con 3 botones SÍ NO y CANCELAR

 //alertdialog for exit the app AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); // set the title of the Alert Dialog alertDialogBuilder.setTitle("your title"); // set dialog message alertDialogBuilder .setMessage("your message") .setCancelable(false) .setPositiveButton("YES"), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { // what to do if YES is tapped finishAffinity(); System.exit(0); } }) .setNeutralButton("CANCEL"), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { // code to do on CANCEL tapped dialog.cancel(); } }) .setNegativeButton("NO"), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { // code to do on NO tapped dialog.cancel(); } }); AlertDialog alertDialog = alertDialogBuilder.create(); alertDialog.show(); 

No es una buena decisión, porque es contra los principios de procesamiento de aplicaciones de Android. Android no mata ningún proceso a menos que sea absolutamente inevitable. Esto ayuda a que las aplicaciones empiecen más rápido, ya que siempre se guardan en la memoria. Así que necesitas una razón muy especial para matar el proceso de tu aplicación.

Esto puede ser muy tarde y también según las pautas que no se supone que manejas el proceso del ciclo de vida por ti mismo (como el os hace eso para ti). Una sugerencia sería que registre un receptor de radio en todas sus actividades con " finish() " en su onReceive() y siempre que desee dejar de fumar, puede pasar una intención que indica que todas las actividades deben cerrarse. Asegúrese de hacer "desregistrar" el receptor en sus métodos onDestroy() .

De su actividad de nivel superior:

 super.onBackPressed(); 

Esto matará cualquier cosa;)

 int p = android.os.Process.myPid(); android.os.Process.killProcess(p); 

Usted puede sus aplicaciones completas bastante. así

 Intent intent = getBaseContext().getPackageManager() .getLaunchIntentForPackage(getBaseContext().getPackageName()); intent .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); 

Funcionará 100%. ¡La mejor de las suertes!

Sólo use finish () en la tecla de retroceso presionar onKeypressed ()

Escriba este código en su método de reemplazo con retroceso

 @Override public void onBackPressed() { Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.