¿Cómo salir de la aplicación y mostrar la pantalla de inicio?


196

Tengo una aplicación donde en la página de inicio tengo botones para navegar por la aplicación.

En esa página tengo un botón "SALIR" que, cuando se hace clic, debe llevar al usuario a la pantalla de inicio del teléfono donde se encuentra el icono de la aplicación.

¿Cómo puedo hacer eso?

Respuestas:


327

El diseño de Android no favorece la salida de una aplicación por elección, sino que la administra el sistema operativo. Puede abrir la aplicación Inicio por su intención correspondiente:

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

25
Incluso puede usar ... "moveTaskToBack (verdadero);"
hemanth kumar

17
¿Desasignará todos los recursos? Porque cuando salgo de la aplicación de esta manera y después de un tiempo vuelvo a hacer clic en el icono de la aplicación. Comienza desde donde lo dejé. Eso significa que la aplicación todavía se estaba ejecutando en segundo plano.
Adil Malik

12
Activity.finish ();
hB0

11
Esto mantiene su aplicación en segundo plano, por lo que no sale de la aplicación.
Herman Schoenfeld

3
Esta respuesta solo hará que aparezca la pantalla de inicio y no saldrá / cerrará la aplicación por completo como lo desea el OP.
Basher51

74

Puede ser que puedas probar algo como esto

Supongamos que en nuestra aplicación, tenemos una serie de actividades (digamos diez) y necesitamos salir directamente de esta actividad. Lo que podemos hacer es crear una intención e ir a la actividad raíz y establecer la marca en la intención como

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

Además, agregue algo extra como booleano a la intención

intent.putExtra("EXIT", true);

Luego, en la actividad raíz, verifique el valor de booleany de acuerdo con esa llamada terminar (), en la onCreate()actividad raíz

if (getIntent().getBooleanExtra("EXIT", false)) {
 finish();
}

1
Simplemente no haga nada en onCreate para invocar el acabado.
imcaptor

2
En mi caso, tuve que anular onNewIntenttambién. Porque intnet.getExtras () seguía siendo nulo.
zznq

Y este método reiniciará su en RootActivitylugar de reanudarlo desde la pila. Marque aquí para superar este stackoverflow.com/a/26258455/609782
Darpan

29
System.exit(0);

Es probablemente lo que estás buscando. Cerrará toda la aplicación y lo llevará a la pantalla de inicio.


1
¿Debería ser una salida en minúsculas?
Carol

1
debe ser System.exit (0). Pero no es muy útil de todos modos.
superarts.org

77
System.exit (0) no debe usarse como lo recomienda el equipo principal de Android.
Dinesh Venkata

2
Creo que este es el mejor enfoque para circunstancias excepcionales. Digamos para una aplicación que necesita internet y la conexión interrumpe algunas actividades en la aplicación. Se puede mostrar un cuadro de diálogo de alerta (sin botones). El botón Atrás debe salir de toda la aplicación, ya que para volver a ingresar es necesario iniciar sesión / iniciar nuevamente. System.exit es lo único que funciona razonablemente que he encontrado. Sin embargo, no estoy seguro del comentario de @ user1699548.
Herman Schoenfeld

1
¿Esto también eliminará todos los servicios relacionados con esa aplicación?
bsara

25

Esto funciona bien para mi.
Cierre todas las actividades anteriores de la siguiente manera:

    Intent intent = new Intent(this, MainActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.putExtra("Exit me", true);
    startActivity(intent);
    finish();

Luego, en el método MainActivity onCreate (), agregue esto para finalizar MainActivity

    setContentView(R.layout.main_layout);

    if( getIntent().getBooleanExtra("Exit me", false)){
        finish();
        return; // add this to prevent from doing unnecessary stuffs
    }

Esto no funciona para mi. Deja mi aplicación sin nada visible, pero sigue funcionando de alguna manera. Puedo ver hilos dando vueltas y esperando en el depurador que en realidad nunca harán nada.
Stephen M -en huelga-

23

primero termine su aplicación usando el método finish();

y luego agregue las siguientes líneas en onDestroy para eliminar Force close

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

3
nunca use esto, porque no tiene oportunidad de liberar recursos
Jacky

1
-1 porque onDestroy se ejecuta cada vez que abandonas la actividad, no solo cuando se presiona la tecla Atrás.
Hamzeh Soboh

55
@Jacky: ¿y cómo matar el proceso no libera recursos del sistema?
Herman Schoenfeld

1
¿Por qué es el super.onDestroy()después del killProcess()? ¿se alcanzaría esta línea?
shoosh

¿Esto no mata también todos sus servicios?
Irshu

20

Si desea finalizar una actividad, simplemente puede llamar finish(). Sin embargo, es una mala práctica tener un botón de salida en la pantalla.


2
Lo estoy usando para "Necesitas actualizar esta aplicación a la última versión", y no quiero que sigan usándola. ¿Sigue siendo una mala práctica ...?
Beetree

@beetree Sí. Como cualquier mala práctica, hay casos en los que es su única opción, y la usa porque tratar de hacer otra cosa no tendría sentido. El punto de ser una mala práctica , a diferencia de la sintaxis ilegal , es que está disponible para esos pocos casos, pero debe hacer todo lo posible para encontrar una mejor manera de hacerlo. En tu caso, no hay uno.
Fondo de la demanda de Mónica

17

Algunas actividades realmente no desea volver a abrir cuando se presiona el botón Atrás, como Actividad de la pantalla de bienvenida, Actividad de la pantalla de bienvenida, Ventanas de confirmación. En realidad no necesitas esto en la pila de actividades. puede hacer esto usando => abrir el archivo manifest.xml y agregar un atributo

android: noHistory = "true"

a estas actividades.

<activity
    android:name="com.example.shoppingapp.AddNewItems"
    android:label="" 
    android:noHistory="true">
</activity>

O

A veces desea cerrar toda la aplicación presionando el botón Atrás. Aquí la mejor práctica es abrir la ventana de inicio en lugar de salir de la aplicación. Para eso necesitas anular el método onBackPressed (). Por lo general, este método abre la actividad principal en la pila.

@Override
public void onBackPressed(){
Intent a = new Intent(Intent.ACTION_MAIN);
a.addCategory(Intent.CATEGORY_HOME);
a.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(a);

}

O

Al presionar el botón Atrás, desea salir de esa actividad y tampoco desea agregar esto en la pila de actividades. llame al método finish () dentro del método onBackPressed (). no cerrará toda la aplicación. irá a la actividad anterior en la pila.

@Override
public void onBackPressed() {
  finish();
}

16

No se recomienda salir de su aplicación de Android. Ver esta pregunta para más detalles.

El usuario siempre puede salir de su aplicación a través del botón de inicio o en la primera actividad a través del botón de retroceso.


3
@janusz: presionar el botón de inicio nunca sale de la aplicación de Android, en su lugar, pasa a segundo plano ...
Jayesh

5

(Intenté respuestas anteriores pero carecen de algunos puntos. Por ejemplo, si no haces un return; actividad después de finalizar la actividad, se ejecuta el código de actividad restante. También debe editar onCreate con return. Si no ejecuta super.onCreate () obtendrá un error de tiempo de ejecución)

Digamos que tienes MainActivityy ChildActivity.

Inside ChildActivity agrega esto:

Intent intent = new Intent(ChildActivity.this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);
return true;

Dentro de MainActivity's onCreate agregue esto:

@Override
public void onCreate(Bundle savedInstanceState) {

    mContext = getApplicationContext();

    super.onCreate(savedInstanceState);

    if (getIntent().getBooleanExtra("EXIT", false)) {
        finish();
        return;
    }
    // your current codes
    // your current codes
}


3

Cuando llame a terminar, se llamará a onDestroy () de esa actividad y volverá a la actividad anterior en la pila de actividades ... Entonces, para salir, no llame a terminar ();


3

Esto es lo que hice:

SomeActivity.java

 @Override
    public void onBackPressed() {
            Intent newIntent = new Intent(this,QuitAppActivity.class);
            newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(newIntent);
            finish();
    }

QuitAppActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      finish();
}

Básicamente, lo que hiciste fue borrar todas las actividades de la pila y el lanzamiento QuitAppActivity, eso finalizará la tarea.


Buen enfoque. No es necesario pasar valores a través de Intent.
user3144836

0

Agregue las siguientes líneas después finish();en onDestroy():

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

0

Intenté salir de la aplicación usando el siguiente fragmento de código, esto funcionó para mí. Espero que esto te ayude. hice una pequeña demostración con 2 actividades

primera actividad

public class MainActivity extends Activity implements OnClickListener{
    private Button secondActivityBtn;
    private SharedPreferences pref;
    private SharedPreferences.Editor editer;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        secondActivityBtn=(Button) findViewById(R.id.SecondActivityBtn);
        secondActivityBtn.setOnClickListener(this);

        pref = this.getSharedPreferences("MyPrefsFile", MODE_PRIVATE);
        editer = pref.edit();

        if(pref.getInt("exitApp", 0) == 1){
            editer.putInt("exitApp", 0);
            editer.commit();
            finish();
        }
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.SecondActivityBtn:
            Intent intent= new Intent(MainActivity.this, YourAnyActivity.class);
            startActivity(intent);
            break;
        default:
            break;
        }
    }
}

tu cualquier otra actividad

public class YourAnyActivity extends Activity implements OnClickListener {
    private Button exitAppBtn;
    private SharedPreferences pref;
    private SharedPreferences.Editor editer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_any);

        exitAppBtn = (Button) findViewById(R.id.exitAppBtn);
        exitAppBtn.setOnClickListener(this);

        pref = this.getSharedPreferences("MyPrefsFile", MODE_PRIVATE);
        editer = pref.edit();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.exitAppBtn:
            Intent main_intent = new Intent(YourAnyActivity.this,
                    MainActivity.class);
            main_intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(main_intent);
            editer.putInt("exitApp",1);
            editer.commit();
            break;
        default:
            break;
        }
    }
}

0

Lo hice con modo observador.

Interfaz de observador

public interface Observer {
public void update(Subject subject);
}

Asunto base

public class Subject {
private List<Observer> observers = new ArrayList<Observer>();

public void attach(Observer observer){
    observers.add(observer);
}

public void detach(Observer observer){
    observers.remove(observer);
}

protected void notifyObservers(){
    for(Observer observer : observers){
        observer.update(this);
    }
}
}

Asunto secundario implementa el método de salida

public class ApplicationSubject extends Subject {
public void exit(){
    notifyObservers();
}
}

MyApplication que su aplicación debería extender

public class MyApplication extends Application {

private static ApplicationSubject applicationSubject;

public ApplicationSubject getApplicationSubject() {
            if(applicationSubject == null) applicationSubject = new ApplicationSubject();
    return applicationSubject;
}

}

Actividad base

public abstract class BaseActivity extends Activity implements Observer {

public MyApplication app;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    app = (MyApplication) this.getApplication();
    app.getApplicationSubject().attach(this);
}

@Override
public void finish() {
    // TODO Auto-generated method stub
            app.getApplicationSubject().detach(this);
    super.finish();
}

/**
 * exit the app
 */
public void close() {
    app.getApplicationSubject().exit();
};

@Override
public void update(Subject subject) {
    // TODO Auto-generated method stub
    this.finish();
}

}

probémoslo

public class ATestActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    close(); //invoke 'close'
}
}

0

si quieres salir de la aplicación pon este código bajo tu función

public void yourFunction()
{
finishAffinity();   
moveTaskToBack(true);

}



//For an instance, if you want to exit an application on double click of a 
//button,then the following code can be used.
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 2) {
        // do something on back.
        From Android 16+ you can use the following:

        finishAffinity();
        moveTaskToBack(true);
    }

    return super.onKeyDown(keyCode, event);
}

0

100% funciona bien. Este es el código para Salir de su aplicación onClick (Método)

    Button exit = (Button)findViewById(R.id.exitbutton);

    exit.setOnClickListener(new View.OnClickListener() {

        @Override

        public void onClick(View view) {

            finish();
            android.os.Process.killProcess(android.os.Process.myPid());
            System.exit(1);
            Toast.makeText(getApplicationContext(), "Closed Completely and Safely", Toast.LENGTH_LONG).show();

        }
    });

0

Simplemente puede agregar moveTaskToBack(true)los botones de salida onClickedListenerpara minimizar la aplicación.

Espero eso ayude.


0

Tal vez mi código puede hepls (Main_Activity.java):

    @Override
    protected void onDestroy() {
        super.onDestroy();
        this.finish();
        exit(0);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)  {
        switch(keyCode)    {
            case KeyEvent.KEYCODE_BACK:
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setTitle("My application").setMessage("Keep playing?").setIcon(R.drawable.icon);
                // Go to backgroung
                builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) { moveTaskToBack(true); }
                });
                // Exit from app calling protected void onDestroy()
                builder.setNegativeButton("CLOSE APPLICATION", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) { onDestroy(); }
                });
                // Close this dialog
                builder.setNeutralButton("CANCEL", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) { dialog.cancel(); }
                });
                AlertDialog dialog = builder.create();
                dialog.show();
                return true;
        }
        return false;
    }

-2

Si desea salir de su aplicación. Luego use este código dentro del evento de botón presionado. me gusta:

public void onBackPressed()
{
    moveTaskToBack(true);
    android.os.Process.killProcess(android.os.Process.myPid());
    System.exit(1);
}
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.