Come uscire dall'applicazione e mostrare la schermata principale?


196

Ho un'applicazione in cui nella home page ho i pulsanti per la navigazione attraverso l'applicazione.

In quella pagina ho un pulsante "EXIT" che quando viene cliccato dovrebbe portare l'utente alla schermata principale sul telefono dove si trova l'icona dell'applicazione.

Come lo posso fare?

Risposte:


327

Il design di Android non favorisce l'uscita da un'applicazione per scelta, ma piuttosto la gestisce dal sistema operativo. Puoi visualizzare l'applicazione Home in base al suo Intento corrispondente:

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

25
Puoi persino usare .. "moveTaskToBack (true);"
hemanth kumar

17
dislocherà tutte le risorse? Perché quando esco dall'app in questo modo e dopo qualche tempo faccio di nuovo clic sull'icona dell'app. Inizia da dove l'ho lasciato. Ciò significa che l'app era ancora in esecuzione in background.
Adil Malik,

12
Activity.finish ();
hB0

11
Ciò mantiene la tua app in background, quindi non esce dall'applicazione.
Herman Schoenfeld,

3
Questa risposta farà apparire la schermata principale e non uscirà / chiuderà completamente l'applicazione come vuole l'OP.
Basher51,

74

Forse puoi provare qualcosa del genere

Supponiamo che nella nostra applicazione abbiamo una serie di attività (diciamo dieci) e che dobbiamo uscire direttamente da questa attività. Quello che possiamo fare è, creare un intento e andare all'attività di root e impostare flag nell'intento come

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

inoltre, aggiungi qualche extra come booleano all'intento

intent.putExtra("EXIT", true);

Quindi, nell'attività root, controlla il valore di booleane in base a quella chiamata finish (), nell'attività onCreate()root

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

1
Non fare nulla in onCreate per invocare finish.
imcaptor,

2
Nel mio caso ho dovuto scavalcare onNewIntentanche io . Perché intnet.getExtras () continuava ad essere nullo.
zznq,

E questo metodo riavvierà il tuo RootActivityinvece di riprenderlo dallo stack. Controllare qui per superare questo stackoverflow.com/a/26258455/609782
Darpan

29
System.exit(0);

È probabilmente quello che stai cercando. Chiuderà l'intera applicazione e ti porterà alla schermata principale.


1
Dovrebbe essere un'uscita in minuscolo?
Carol,

1
dovrebbe essere System.exit (0). Ma non è molto utile comunque.
superarts.org

7
System.exit (0) non deve essere utilizzato come consigliato dal team Android principale.
Dinesh Venkata,

2
Penso che questo sia l'approccio migliore per circostanze eccezionali. Dì per un'app che ha bisogno di Internet e la connessione interrompe alcune attività nell'app. È possibile visualizzare una finestra di avviso (senza pulsanti). Il pulsante Indietro deve uscire dall'intera app poiché il rientro richiede nuovamente l'accesso / inizializzazione. System.exit è l'unica cosa che funziona ragionevolmente che ho trovato. Non sono sicuro del commento di @ user1699548 però.
Herman Schoenfeld,

1
Questo ucciderà anche tutti i servizi correlati a quell'app?
bsara,

25

Questo funziona bene per me.
Chiudi tutte le attività precedenti come segue:

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

Quindi nel metodo MainActivity onCreate () aggiungilo per completare MainActivity

    setContentView(R.layout.main_layout);

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

Questo non funziona per me. Lascia la mia app con nulla di visibile, ma funziona ancora come. Riesco a vedere i thread in giro e in attesa nel debugger che in realtà non farà mai nulla.
Stephen M -on strike -

23

per prima cosa completa l'applicazione usando il metodo finish();

e quindi aggiungi le righe sottostanti in onDestroy per la rimozione della forza di chiusura

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

3
mai usare questo, perché non ha alcuna possibilità di liberare risorse
Jacky

1
-1 perché onDestroy viene eseguito ogni volta che si lascia l'attività, non solo quando si preme il tasto Indietro.
Hamzeh Soboh,

5
@Jacky: e in che modo uccidere il processo non libera risorse di sistema?
Herman Schoenfeld,

1
Perché il super.onDestroy()dopo il killProcess()? questa linea sarebbe stata raggiunta?
shoosh

questo non uccide anche tutti i tuoi servizi?
Irshu,

20

Se vuoi terminare un'attività puoi semplicemente chiamare finish(). È comunque una cattiva pratica avere un pulsante di uscita sullo schermo.


2
Lo sto usando per "Devi aggiornare questa app all'ultima versione" e non voglio che continuino ad usarla. Ancora cattiva pratica ...?
Beetree

@beetree Sì. Come ogni cattiva pratica, ci sono casi in cui è la tua unica opzione e la usi perché cercare di fare qualcos'altro sarebbe privo di senso. Il punto è che è una cattiva pratica , al contrario della sintassi illegale , è che è disponibile per quei pochi casi, ma dovresti provare il tuo dannato per trovare un modo migliore per farlo. Nel tuo caso, non ce n'è uno.
Fondo Monica's Lawsuit,

17

Alcune attività in realtà non si desidera riaprire quando si preme il pulsante Indietro, ad esempio Attività schermata iniziale, Attività schermata iniziale, Finestre di conferma. In realtà non è necessario questo nello stack di attività. puoi farlo usando => apri il file manifest.xml e aggiungi un attributo

Android: noHistory = "true"

a queste attività.

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

O

A volte si desidera chiudere l'intera applicazione premendo un certo pulsante Indietro. Qui la best practice è aprire la finestra principale invece di uscire dall'applicazione. Per questo è necessario sovrascrivere il metodo onBackPressed (). di solito questo metodo apre l'attività principale nello stack.

@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

Nel pulsante Indietro premuto vuoi uscire da quell'attività e inoltre non vuoi aggiungerlo nello stack di attività. chiama il metodo finish () all'interno del metodo onBackPressed (). non chiuderà l'intera applicazione. andrà per l'attività precedente nello stack.

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

16

Non è consigliabile uscire dall'applicazione Android. Vedi questa domanda per maggiori dettagli.

L'utente può sempre uscire dall'app tramite il pulsante Home o nella prima attività tramite il pulsante Indietro.


3
@janusz: premendo il tasto home non si esce mai dall'applicazione Android, invece va in background ...
Jayesh

5

(Ho provato le risposte precedenti ma mancano in alcuni punti. Ad esempio se non lo fai return; dopo aver terminato, il codice attività rimanente viene eseguito. Inoltre è necessario modificare onCreate con ritorno. Se non si esegue super.onCreate () otterrai un errore di runtime)

Di 'che hai MainActivitye ChildActivity.

Inside ChildActivity aggiungi questo:

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

OnCreate di MainActivity aggiungi questo:

@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

Quando chiamerai finish, verrà chiamata onDestroy () di quell'attività e tornerà all'attività precedente nello stack di attività ... Quindi .. per uscire non chiamare finish ();


3

Ecco cosa ho fatto:

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

Fondamentalmente quello che hai fatto è stato cancellato tutte le attività dallo stack e dal lancio QuitAppActivity, che completerà l'attività.


Buon approccio. Non è necessario passare valori tramite Intent.
user3144836

0

Aggiungi le seguenti righe dopo finish();in onDestroy():

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

0

Ho provato a uscire dall'applicazione usando il seguente frammento di codice, questo ha funzionato per me. Spero che questo ti aiuti. ho fatto una piccola demo con 2 attività

prima attività

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;
        }
    }
}

qualsiasi altra attività

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

L'ho fatto con la modalità osservatore.

Interfaccia osservatore

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

Soggetto di 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);
    }
}
}

Il soggetto figlio implementa il metodo di uscita

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

MyApplication quale applicazione dovrebbe estenderla

public class MyApplication extends Application {

private static ApplicationSubject applicationSubject;

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

}

Attività di 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();
}

}

proviamolo

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

0

se vuoi uscire dall'applicazione metti questo codice sotto la tua funzione

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% funziona bene. questo è il codice per uscire dall'app onClick (metodo)

    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

Puoi semplicemente aggiungere moveTaskToBack(true)il pulsante di uscita onClickedListenerper ridurre al minimo l'applicazione.

Spero che sia d'aiuto.


0

Forse il mio codice può 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

Se vuoi uscire dalla tua applicazione. Quindi utilizzare questo codice all'interno dell'evento premuto pulsante. piace:

public void onBackPressed()
{
    moveTaskToBack(true);
    android.os.Process.killProcess(android.os.Process.myPid());
    System.exit(1);
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.