Come chiudere l'attività e tornare all'attività precedente in Android


144

Ho un'attività principale, che quando faccio clic su un pulsante, avvia una nuova attività, ho usato il seguente codice per farlo:

Intent intent = new Intent(this, SettingsActivity.class);
startActivity(intent);

Il codice sopra è stato eseguito dall'attività principale.

Ora nella mia nuova attività che viene chiamata dall'attività principale, ho un pulsante Indietro. Quando faccio clic su questo pulsante Indietro, desidero chiudere la mia nuova attività e deve tornare all'attività principale originale.

Ho provato a chiamare super.finish()e solo finish() (dalla nuova attività) ma questo poi chiude la mia intera applicazione (compresa la mia attività principale).

Come posso semplicemente chiudere l'attività che è attualmente a fuoco, e quindi tornare all'attività principale?

MODIFICATO

Il fatto che anche il pulsante Indietro del mio telefono chiuda l'intera mia app, mi porta a pensare di aver avviato la seconda attività in modo errato?


OK ho cercato

Ho creato un'attività Impostazioni che utilizza lo stesso codice manifest e lo stesso codice per avviare l'attività.

Per le impostazioni Attività quando premo il pulsante Indietro, torna all'attività principale.

Con l'attività sopra menzionata nella domanda principale, esce semplicemente dalla mia intera app.

Quindi il problema non sembra essere con il codice per terminare l'attività ma l'attività stessa.


4
Non è nemmeno necessario un pulsante Indietro, basta consentire all'utente di utilizzare il tasto Indietro del telefono e non è necessario fare nulla.
Hoan Nguyen,

Il pulsante Indietro telefoni chiude l'applicazione di entrata, non solo la mia attività secondaria. Non voglio chiudere l'attività principale.
Zapnologica,

1
Il pulsante 'indietro' non dovrebbe farlo - puoi mostrare più del tuo codice?
Peejaybee,

In risposta alla tua modifica, l'attività secondaria sembra buona da ciò che hai pubblicato. Penso che TGMCians abbia probabilmente la risposta giusta e tu indaga sul tuo manifest.
Peejaybee,

vedi questa risposta penso che questo ti aiuterà
Muhammad Helmi,

Risposte:


201

Penso che stai chiamando il finish()metodo MainActivityprima di iniziare SettingsActivity.

Lo scenario che hai descritto avverrà in due modi:

O

È stato impostato android:noHistory = "true"per la MainActivityparte interna AndroidManifest.xmlche provoca MainActivitya finishautomaticamente premendo il tasto indietro.

O

Prima di passare a "Impostazioni attività", hai chiamato il finish()tuo MainActivity, che lo uccide. Quando si preme il pulsante Indietro, poiché nessun'altra attività è preimpostata in pila per essere pop, torna alla schermata principale.


Ciò spiegherebbe perché il pulsante "indietro" del telefono ignora anche l'attività principale.
Peejaybee,

Durante il debug, ho notato che l'esecuzione continua dopo finish (), quindi è consigliabile aggiungere un ritorno.
fino al

Il terzo motivo di questa risposta non è solo una ripetizione del primo?
Pang

60

Puoi tornare all'attività precedente semplicemente chiamando finish () nell'attività in cui ti trovi. Nota che verrà eseguito qualsiasi codice dopo la chiamata di finish () - puoi semplicemente fare un ritorno dopo aver chiamato finish () per risolvere questo problema.

Se si desidera restituire i risultati all'attività uno, quando si avvia l'attività due è necessario:

startActivityForResults(myIntent, MY_REQUEST_CODE);

All'interno dell'attività chiamata è quindi possibile ottenere l'intento dal parametro onCreate () o utilizzato

getIntent();

Per impostare restituire un risultato all'attività uno, quindi all'attività due

setResult(Activity.RESULT_OK, MyIntentToReturn);

Se non hai intenzione di tornare, basta dire

setResult(Activity.RESULT_OK);

Se l'attività ha risultati negativi, puoi utilizzare Activity.RESULT_CANCELED (utilizzato per impostazione predefinita). Quindi nell'attività uno che fai

onActivityResult(int requestCode, int resultCode, Intent data) {
    // Handle the logic for the requestCode, resultCode and data returned...
}

Per terminare l'attività due utilizzare gli stessi metodi con finish () come descritto sopra con i risultati già impostati.


1
"Nota che verrà eseguito qualsiasi codice dopo la chiamata di finish () - puoi semplicemente fare un ritorno dopo aver chiamato finish () per risolvere questo problema" Penso che 'fix' sia una cattiva scelta di parole qui. È più come se stessi evitando l'esecuzione delle seguenti righe (non risolvendo).
Lo-Tan,

14

Quando fai clic sul tuo pulsante puoi farlo chiamare:

super.onBackPressed();

11

se usi il frammento dovresti usare

getActivity().onBackPressed();

se usi un'attività singola puoi usare

finish();

7

prova questo codice invece di finish:

onBackPressed();


2
Funziona bene per tornare da ActivityB ad ActivityA. Per frammenti e singole attività potrebbero usare la risposta di @Osama Ibrahim.
Eftekhari,


4
Button edit = (Button) view.findViewById(R.id.yourButton);
edit.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View view) {
        Intent intent = new Intent(this, YourMainActivity.class);
        startActivity(intent);
        finish();
    }
});


4

Credo che la tua seconda attività non sia probabilmente collegata alla tua attività principale come attività figlio. Controlla il tuo AndroidManifest.xmlfile e vedi se la <activity>voce relativa alla tua attività figlio include un android:parentActivityNameattributo. Dovrebbe assomigliare a qualcosa di simile a questo:

<?xml ...?>
...
<activity
    android:name=".MainActivity"
    ...>
</activity>
<activity
    android:name=".ChildActivity"
    android:parentActivityName=".MainActivity"
    ...>
</activity>
...

1

Basta non invocare finish()il tuo, MainActivityquesto elimina la necessità di sostituire il tuo onBackPressed()nel tuo a SecondActivitymeno che tu non stia facendo altre cose in quella funzione. Se si sente il "bisogno" di questo pulsante allora si può semplicemente chiamare finish()il SecondActivitye che vi porterà alla vostra MainActivityfinché non l'hai chiamato finish()su di esso


Ho provato questo percorso, ma ho circa 10 schermate in sequenza che utilizzano PNG ad alta risoluzione. Il problema è, a proposito della schermata 7, che il dispositivo ha esaurito le memorie a causa di tutte le attività nel back-stack. Ho deciso di chiamare finish su ogni attività, e questo ha risolto il problema consentendo la garbage collection, ma ora il comportamento sul retro deve essere codificato manualmente perché il back-stack è ora vuoto. Hai riscontrato questo problema o conosci qualche meccanismo in Android per risolvere questo problema?
Lo-Tan,

Cosa vuoi che faccia il pulsante Indietro? Torna a qualunque fosse il precedente Activityo torna sempre a MainActivity? Inoltre, se stai esaurendo la memoria con Bitmaps, dovresti leggere questa parte di Documenti . Mi ha aiutato
codeMagic

@ Lo-Tan se vuoi tornare all'attività precedente, allora penso che devi capire la gestione della memoria per le tue immagini e non finire le attività (forse con il link che ho fornito). Altrimenti, dovrai ricreare una nuova istanza dell'attività e provare a capire a quale tornare
codeMagic

Vorrei che il pulsante Indietro passasse alla schermata precedente. Questa è una serie di schermate tutorial, in pratica, e l'utente può andare avanti / indietro. Ogni schermo è progettato e utilizza molti png, a volte png che occupano la maggior parte dello schermo (non solo piccole anteprime), quindi sta assorbendo molta memoria per ogni schermo.
Lo-Tan,

@ Lo-Tan Penso che tu voglia sovrascrivere il metodo onBackPressed () e quindi creare manualmente l'attività a cui vuoi andare. È quindi possibile terminare quello in cui ci si trova e avviare quello precedente.
Zapnologica,

1

Non so se questo sia utile o meno, ma stavo lottando con lo stesso problema e ho trovato un modo abbastanza semplice, con solo una variabile booleana globale e un'azione onResume (). Nel mio caso, la mia attività C se si fa clic in un pulsante specifico dovrebbe attivare la fine () dell'attività B!

Attività_A -> Attività_B -> Attività_C

Activity_A (apre normalmente Activity_B)

Activity_B (facendo clic su un pulsante si apre Activity_C):

// Global:
boolean its_detail = false;
// -------
SharedPreferences prefs =  getApplicationContext().getSharedPreferences("sharedpreferences", 0);
boolean v = prefs.getBoolean("select_client", false);

its_detail = v;

startActivity(C);

@Override
public void onResume(){
     super.onResume();
     if(its_detail == true){
        finish();
     }
}

Quindi, ogni volta che faccio clic sul pulsante sull'attività C, la funzione "onResume ()" dell'attività B torna all'attività A.


1
 @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if ( id == android.R.id.home ) {
            finish();
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

Prova questo funziona sia sul pulsante indietro barra degli strumenti come pulsante Indietro hardware .


Questo ha funzionato per me. Ho anche avuto un MainActivity e un SettingsActivity con android:parentActivityName=".MainActivity"per il secondo. Questo codice gestisce il pulsante Home / Back nella barra degli strumenti e termina l'attività corrente tornando a quella precedente nello stack. Grazie.
mortalis,

1

Finish chiude l'intera applicazione, questa è una cosa che odio nello sviluppo di Android non finisce bene ma che non tengono il passo con la sintassi ok che hanno

startActivity(intent)

Perchè no

closeActivity (intent)?


1
Questo risponde alla domanda? O è solo un suggerimento da provare? In entrambi i casi, il rant è inutile e probabilmente non è il benvenuto su SO
Gilles Gouaillardet,

1

Abbiamo riscontrato una situazione molto simile.

Attività 1 (apertura) -> Attività 2 (anteprima) -> Attività 3 (dettaglio)

Risposta "in back press" errata

  • La pressione posteriore del dispositivo sull'attività 3 chiuderà anche l'attività 2.

Ho controllato tutte le risposte postate sopra e nessuna di queste ha funzionato. La sintassi Java per la transizione tra l'attività 2 e l'attività 3 è stata rivista per essere corretta.

Fresco di codifica su come chiamare un'app di terze parti. da un'attività. Abbiamo deciso di studiare l'angolo di configurazione, consentendoci infine di identificare la causa principale del problema.

Scopo : configurazione dell'attività 2 (chiamante).

Causa principale :

android:launchMode="singleInstance"

Soluzione :

android:launchMode="singleTask"

Apparentemente su questo problema di "stampa sul retro" singleInstance considera le attività invocate in un'istanza con l'attività chiamante, mentre singleTask consentirà alle attività invocate che hanno la propria identità abbastanza da consentire al funzionamento della retro stampa di funzionare come dovrebbe.


0
{ getApplicationContext.finish();   }

Prova questo metodo ..


Sebbene questo blocco di codice possa rispondere alla domanda, sarebbe meglio se tu potessi fornire una piccola spiegazione del perché lo faccia.
David

0

è possibile che tu stia chiamando finish (); nell'evento pulsante clic, quindi l'attività principale viene chiusa subito dopo aver fatto clic sul pulsante e quando si ritorna dall'attività successiva, l'applicazione viene chiusa perché l'attività principale è già chiusa e non è attiva alcuna attività.


0

sul metodo onCreate della tua attività scrivi il seguente codice.

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);

Quindi sovrascrivi il metodo onOptionsItem selezionato della tua attività come segue

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()){
        case android.R.id.home:
            finish();
    }
    return super.onOptionsItemSelected(item);
}

E sei a posto.


0

Devi usarlo nella tua MainActivity

 Intent intent = new Intent(context , yourActivity);

            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
            context.startActivity(intent);

Il flag avvierà più attività che manterranno la tua MainActivity, quando chiamerai finish ucciderà l'altra attività e ti riporterà a MainActivity

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.