¿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?

Jugo de limon
fuente
¿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); 
Fayaz
fuente
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);

                }
            });
Anchit Mittal
fuente
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!

Shreshth Kharbanda
fuente
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);
}
Pir Fahim Shah
fuente
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();
    }
Sai Aditya
fuente
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
17

Es demasiado fácil. UtilizarSystem.exit(0);

Amon Olimov
fuente
2
Jajaja. No es demasiado fácil
TheRealChx101
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());
Kasun
fuente
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.

Akeshwar Jha
fuente
6
android.os.Process.killProcess(android.os.Process.myPid());
kathir
fuente
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);
Mahmood Ali
fuente
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);
    }
azeem khan
fuente
2

pon este en tu onClic:

moveTaskToBack(true);
    finish()
Stan Malcolm
fuente
¿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

Rishiraj Purohit
fuente
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....:)

Yesha Shah
fuente
2

Logrando en Xamarin.Android:

    public override void OnBackPressed()
    {
        MoveTaskToBack(true);
        Process.KillProcess(Process.MyPid());
        Environment.Exit(1);
    }
GONeale
fuente
¿Es esta una referencia a System.Environment.Salir o Android.OS.Environment.Salir?
Moffen
2

Simplemente llame a estas dos funciones

 finish();
 moveTaskToBack(true);
younes
fuente
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.

Abdul Kadir
fuente
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

JesúsS
fuente
1

Funciona usando solo moveTaskToBack(true);

usuario3856297
fuente
1

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

Kaze Tdr
fuente
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!

Konrad
fuente
1

en el fragmento

getActivity (). finishAndRemoveTask ();

en la actividad

finishAndRemoveTask ();

Rodrigo Givisiez
fuente
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);
Sayooj
fuente
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.

Grzegorz Adam Hankiewicz
fuente
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);
Hassnain Jamil
fuente
0
finish();
 finishAffinity();
 System.exit(0);

trabajó para mi

prabhu
fuente
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();
Muhammad Naveed
fuente
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();
        }
    }
Sihat Afnan
fuente
-1

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

terminar();

System.exit (0);

Abdullah alkış
fuente