¿Cómo salir de una aplicación de Android mediante programación?


93

Estoy seguro de que esta pregunta se ha hecho varias veces porque leí algunas. Mi cliente quiere que ponga un botón en su aplicación donde los usuarios puedan hacer clic y salir. He leído esto y he descubierto que llamar finish()lo hará. Pero, terminar es solo cerrar la actividad de carrera actual, ¿verdad? Tengo muchas actividades, así que en este caso tengo que pasar la instancia de todas y cada una de las actividades y terminarlas o hacer que cada actividad tenga un patrón Singleton.

También supe que Activity.moveTaskToBack(true)puede llevarte a la pantalla de inicio. Bien, esto no es cerrar, sino poner en segundo plano el proceso. Entonces, ¿esto es efectivo?

¿Qué método debo utilizar para cerrar la aplicación por completo? ¿Alguno de los métodos descritos anteriormente o cualquier otro / otro uso de los métodos anteriores?


¿Por qué no usar la barra de acción? haga clic en el icono de la aplicación para navegar a la pantalla de inicio. haga clic en el botón trasero para salir
Raghunandan

@Raghunandan: Como mencioné, requisito del cliente :(
Jugo de limón

Compruebe si esto ayuda a android.os.Process.killProcess (android.os.Process.myPid ());
SANorton Stanley


Respuestas:


71

En realidad, todos buscan cerrar la aplicación en un evento onclick, donde sea que haya actividad ...

Entonces, amigos, prueben este código. Pon este código en el evento onclick

Intent homeIntent = new Intent(Intent.ACTION_MAIN);
    homeIntent.addCategory( Intent.CATEGORY_HOME );
    homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
    startActivity(homeIntent); 

8
En realidad, esto no "cierra la aplicación por completo" como preguntó PeakGen, ya que la aplicación todavía se está ejecutando, pero es una buena alternativa
La masse

2
No lo creo, si una actividad comenzó con FLAG ACTIVITY NEW TASK, de esta manera no puedo salir de ella
fozua

51

Puede llamar a System.exit (); para salir de todas las actividades.

    submit=(Button)findViewById(R.id.submit);

            submit.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View arg0) {
android.os.Process.killProcess(android.os.Process.myPid());
                    System.exit(1);

                }
            });

5
Me lleva a la primera actividad
jugo de limón

8
@AnchitMittal System.exit (1) no garantizará el restablecimiento de la pila de actividades o las tareas (consulte developer.android.com/guide/components/… ). Este enfoque, por lo tanto, no garantiza el cierre adecuado de la aplicación (destruyendo todas las actividades) a su debido tiempo.
IgorGanapolsky

No toda la actividad para salir.
Jitendra

49

El método finishAffinity, lanzado en API 16, cierra todas las actividades en curso y cierra la aplicación:

this.finishAffinity();

Termine esta actividad, así como todas las actividades inmediatamente debajo de ella en la tarea actual que tengan la misma afinidad. Esto se usa generalmente cuando una aplicación se puede iniciar en otra tarea (como desde un ACTION_VIEW de un tipo de contenido que comprende) y el usuario ha usado la navegación hacia arriba para cambiar de la tarea actual a su propia tarea. En este caso, si el usuario ha navegado hacia otras actividades de la segunda aplicación, todas ellas deben eliminarse de la tarea original como parte del cambio de tarea.

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


Desde API 21, puede utilizar:

finishAndRemoveTask();

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

Alternativas:

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


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


Process.sendSignal(Process.myPid(), Process.SIGNAL_KILL);


Intent i = new Intent(context, LoginActivity.class);
i.putExtra(EXTRA_EXIT, true);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
context.startActivity(i);

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


¡Espero eso ayude! ¡Buena suerte!


2
No use System.exit (). Android intentará reiniciar la aplicación después de salir. Podría terminar en un bucle.
AndroidDev

42

Si desea salir de su aplicación, use este código dentro de su evento de botón presionado:

public void onBackPressed() {
  moveTaskToBack(true);
  android.os.Process.killProcess(android.os.Process.myPid());
  System.exit(1);
}

24
 @Override
    public void onBackPressed() {
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
        alertDialogBuilder.setTitle("Exit Application?");
        alertDialogBuilder
                .setMessage("Click yes to exit!")
                .setCancelable(false)
                .setPositiveButton("Yes",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                moveTaskToBack(true);
                                android.os.Process.killProcess(android.os.Process.myPid());
                                System.exit(1);
                            }
                        })

                .setNegativeButton("No", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {

                        dialog.cancel();
                    }
                });

        AlertDialog alertDialog = alertDialogBuilder.create();
        alertDialog.show();
    }

4
¿Cuál es la diferencia entre System.exit (1); y System.exit (0);
Pyae Phyo

System.exit (1) significa que la aplicación terminó con algún error, mientras que System.exit (0) significa que la aplicación terminó sin ningún error. Así es como varios comandos de Linux / Unix devuelven condiciones (de error) al salir.
iOS-Coder


13

De hecho, hay dos situaciones posibles:

  1. Es posible que desee salir de la actividad.
  2. O quieres salir de la aplicación

Puede salir de la actividad usando el siguiente código:

var intent = new Intent(Intent.ActionMain);
intent.AddCategory(Intent.CategoryHome);
intent.SetFlags(ActivityFlags.NewTask);
startActivity(intent);
finish();

Pero esto no eliminará las actividades subyacentes en la misma aplicación. Esto solo minimizará la aplicación.

Si desea salir de la aplicación, use el siguiente código para finalizar su proceso:

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

para desarrollo mono solo use

process.KillProcess(Process.MyPid());

Mypid () es tu método o qué ... entonces, ¿cómo has escrito Mypid ... tienes que escribir con el método .....
Amitsharma

@amitsharma MyPid () es un método de la clase Process, que devuelve el identificador de este proceso, que se puede usar con killProcess (int) y sendSignal (int, int)
Kasun

¿Detendrá también el servicio en segundo plano y los receptores de transmisión o simplemente cerrará la aplicación de manera segura?
Usman Rana

Entonces, ¿cuál es la diferencia entre android.os.Process.killProcess(android.os.Process.myPid()); y process.KillProcess(Process.MyPid());?
DysaniazzZ

7

Qué tal si this.finishAffinity()

De los documentos,

Termine esta actividad, así como todas las actividades inmediatamente debajo de ella en la tarea actual que tengan la misma afinidad. Esto se usa generalmente cuando una aplicación se puede iniciar en otra tarea (como desde un ACTION_VIEW de un tipo de contenido que comprende) y el usuario ha usado la navegación hacia arriba para cambiar de la tarea actual a su propia tarea. En este caso, si el usuario ha navegado hacia otras actividades de la segunda aplicación, todas ellas deben eliminarse de la tarea original como parte del cambio de tarea. Tenga en cuenta que este final no le permite entregar resultados a la actividad anterior, y se lanzará una excepción si está intentando hacerlo.


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

En mi caso, esto me salvó la vida. ¡Gracias!
Lifka

4

esto borrará la Tarea (pila de actividades) y comenzará una nueva Tarea

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
System.exit(1);

Explique por qué publicó este código como respuesta y qué hace también.
M. Adeel Khalid

1
¡Bienvenido a Stack Overflow! Si bien es posible que haya resuelto el problema de este usuario, las respuestas de solo código no son muy útiles para los usuarios que se planteen esta pregunta en el futuro. Edite su respuesta para explicar por qué su código resuelve el problema original.
Joe C

3
 @Override
    public void onBackPressed() {
        Intent homeIntent = new Intent(Intent.ACTION_MAIN);
        homeIntent.addCategory( Intent.CATEGORY_HOME );
        homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(homeIntent);
    }

2

pon este en tu onClic:

moveTaskToBack(true);
    finish()

¿Qué pasa con los votos negativos? Esta es la respuesta. Obtuve 2 actividades, la primera es la actividad de inicio de sesión y la segunda es la actividad principal ... quería salir de la aplicación dentro de la actividad principal y no quiero volver a la actividad de inicio de sesión ... inserto esta respuesta y ahora puedo cerrar la aplicación dentro de la actividad principal.
Azizi Musa

si hace esto, la aplicación seguirá ejecutándose en segundo plano
Mohanad Haddadin

Funcionando bien. Mi caso es: splashActivity ejecuta MainActivity. Cuando el usuario vuelve a presionar en MainActivity, la aplicación sale como se esperaba. ¡Todos los demás casos me devuelven a la actividad de bienvenida!
Jviaches

Bueno, debería haber terminado la actividad de inicio de sesión tan pronto como finalizó el inicio de sesión :) Y la respuesta, por supuesto, no es completamente correcta , movewTaskToBackno termina nada, solo oculta la aplicación y, finishcomo lo mencionó cualquier otra persona, termina solo la actual activity. De modo que abandona la actividad actual y oculta el resto, si se presenta alguno. De todos modos, no debería recibir un voto negativo solo por esto ...
Meow Cat 2012

2

Pruebe esto en una llamada. A veces lo uso al hacer clic en un botón.

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

En lugar de cerrar su aplicación, abre el tablero de modo que parece que su aplicación está cerrada.

lea esta pregunta para obtener más claridad android: salir del código de la aplicación


2

Utilice this.finishAffinity (); en ese botón en lugar de terminar (); Si no funciona, también puedes probar agregando android: noHistory = "true" en tu manifiesto y luego terminar tu actividad uisng finish (); o finishAffinity ();

Espero eso ayude....:)


2

Logrando en Xamarin.Android:

    public override void OnBackPressed()
    {
        MoveTaskToBack(true);
        Process.KillProcess(Process.MyPid());
        Environment.Exit(1);
    }

¿Es esta una referencia a System.Environment.Salir o Android.OS.Environment.Salir?
Moffen

2

Simplemente llame a estas dos funciones

 finish();
 moveTaskToBack(true);

Tu respuesta llegó en publicaciones de menor calidad. Proporcione una explicación aunque su código se explica por sí mismo.
Harsha Biyani

2
Intent homeIntent = new Intent(Intent.ACTION_MAIN);
homeIntent.addCategory( Intent.CATEGORY_HOME );
homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(homeIntent);
System.exit(1);

Use este Código, es muy útil y puede salir de todas las actividades.


Hice esto, y luego tiré el teléfono desde el quinto piso, todas las actividades cerraron gracias
Paschalis

1

la actividad fantasma llamada con singletop y finish () en onCreate debería hacer el truco



1

En lugar de System.exit (1) Simplemente use System.exit (0)


1

Si alguien todavía se pregunta, para Xamarin.Android (en mi caso también Monogame ejecutándose en él) ¡el comando FinishAndRemoveTask()en Activityhace el trabajo muy bien!


1

en el fragmento

getActivity (). finishAndRemoveTask ();

en la actividad

finishAndRemoveTask ();


0

solo usa el código en tu backpress

                    Intent startMain = new Intent(Intent.ACTION_MAIN);
                    startMain.addCategory(Intent.CATEGORY_HOME);
                    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(startMain);

0

Si está utilizando EventBus (o realmente cualquier otra biblioteca de pub / sub) en su aplicación para comunicarse entre actividades, puede enviarles un evento explícito:

final public class KillItWithFireEvent
{
    public KillItWithFireEvent() {}

    public static void send()
    {
        EventBus.getDefault().post(new KillItWithFireEvent());
    }
}

El único inconveniente de esto es que necesita que todas las actividades para escuchar este evento sean propias finish(). Para esto, puede crear fácilmente clases de actividad shim a través de la herencia que solo escuchan este evento y permiten que las subclases implementen todo lo demás, luego asegúrese de que todas sus actividades hereden de esta capa adicional. Los oyentes de matar podrían incluso agregar algunas funciones adicionales a través de anulaciones, como evitar la muerte en ciertas situaciones particulares.


0

Simplemente ejecute las dos líneas siguientes cuando desee salir de la aplicación

android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);

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

trabajó para mi


1
Agrega alguna explicación a tu código. Además, parece que otras respuestas ya cubrieron eso, por lo que también debe explicar qué hace que su solución sea mejor que las demás
Nico Haase

0

Solo llama a esto:

finishAffinity();

Si bien este código puede responder a la pregunta, proporcionar un contexto adicional sobre por qué y / o cómo este código responde a la pregunta mejora su valor a largo plazo.
Igor F.

0

Vincula este método a tu botón salir / salir

public void quitGame(View view) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            finishAndRemoveTask();
        } else {
            finish();
        }
    }

-1

Si usa finalizar y salir, su aplicación se cerrará por completo

terminar();

System.exit (0);

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.