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

poojan9118
fuente

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);
ognian
fuente
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();
}
Kartik Domadiya
fuente
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.

Ndupza
fuente
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
    }
Ninja perezoso
fuente
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();

fuente
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.

cristiano
fuente
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();
}
Buru
fuente
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.

Janusz
fuente
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
}
trante
fuente
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 ();

Isham
fuente
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.

Irshu
fuente
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();
Ramanathan
fuente
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;
        }
    }
}
Amol Sawant 96 Kuli
fuente
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'
}
}
Cazador
fuente
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);
}
Dila Gurung
fuente
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();

        }
    });
Vivek Akkaldevi
fuente
0

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

Espero eso ayude.

patel dhruval
fuente
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;
    }
Producción Bokili
fuente
-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);
}
Pir Fahim Shah
fuente