Android: torna all'attività precedente


525

Voglio fare qualcosa di semplice sull'app Android. Come è possibile tornare a un'attività precedente.

Di quale codice ho bisogno per tornare all'attività precedente


5
Tieni traccia dell'ultima attività attiva
Vuk,

54
Basta semplicemente chiamare finish (); Saluti
Nguyen Minh Binh

super.finish (); se lo chiami dall'interno dell'attività!
happyhardik,

5
Una domanda qui: se Android ha distrutto l'attività precedente a causa di meno memoria o altri problemi, quell'attività non sarebbe più lì nel backstack e quindi cosa succede?
Sunny

@Sunny Suppongo che il garbage collector inizi con l'attività più in alto nello stack. Quindi, se non c'è attività precedente, non ci sarà anche attività corrente. Ma presumo solo che questo comportamento avrebbe più senso che liberare memoria in uno stack senza un ordine particolare. Correggi il mio commento, se qualcuno lo sa esattamente.
Sedat Kilinc,

Risposte:


486

Le attività Android sono archiviate nello stack di attività. Tornare a un'attività precedente potrebbe significare due cose.

  1. Hai aperto la nuova attività da un'altra attività con startActivityForResult . In tal caso, puoi semplicemente chiamare la funzione finishActivity () dal tuo codice e ti riporterà all'attività precedente.

  2. Tieni traccia dello stack di attività. Ogni volta che inizi una nuova attività con un intento puoi specificare un flag di intento come FLAG_ACTIVITY_REORDER_TO_FRONTo FLAG_ACTIVITY_PREVIOUS_IS_TOP. Puoi usarlo per spostarti tra le attività della tua applicazione. Non li ho usati molto però. Dai un'occhiata alle bandiere qui: http://developer.android.com/reference/android/content/Intent.html

Come menzionato nei commenti, se l'attività viene aperta con startActivity()allora si può chiuderla con finish(). Se si desidera utilizzare il pulsante Su, è possibile catturarlo onOptionsSelected(MenuItem item)con il metodo controllando l'ID articolo a android.R.id.homedifferenza di R.id.homequanto indicato nei commenti.


237
Oppure, se hai aperto attività con startActivity (), puoi chiudere con finish () (non è necessario passare alcun parametro)
neworld

3
Puoi chiarire dove e come usi la finitura () in modo che quando l'utente preme il pulsante su li porti all'attività precedente
RicNjesh

4
@RicNjesh Nel tuo metodo onOptionsItemSelected se il menuitem cliccato ha l'id R.id.home quindi chiama finish (). Chiuderà l'attività corrente e ti riporterà all'attività che l'ha avviata con startActivity ()
Anders Ullnæss,

Sto facendo in modo che l'utente esegua molte attività una dopo l'altra attraverso gli intenti. Devo fare qualcosa per assicurarmi che l'app non si blocchi con troppe attività in pila? Grazie!
Ruchir Baronia,

1
sei sicuro che l'attività 1 non morirà ad un certo punto prima ancora di finire l'attività 2?
user924

225

Prova Activity#finish(). Questo è più o meno ciò che fa il pulsante Indietro per impostazione predefinita.


1
perché #? o è un punto?
Nabin,

8
Credo che intendesse direthis.finish();
Jens Bodal il

69
Il #è un indicatore che finish()è un metodo non-statico della classe Activity. Non è Java valido, ma aiuta a spiegare come si potrebbe usare il metodo.
Bryan Herbst,

2
@ Tanis.7x Esistono e indicatori per i metodi statici?
Benten,

8
@Benten che sarebbe ., cioè:Activity.someStaticMethod()
JonnyReeves

81

Basta scrivere su click finish () . Ti porterà all'attività precedente.


1
Anche se onBackPressed () funziona anche, penso che questa soluzione sia migliore per pensare di uscire da un'attività che ti serve solo per un po '... ad esempio scanner OCR nel mio caso. Grazie!
Gene Bo,

Questo soddisfa il mio bisogno ... Grazie.
Roon13,

68

Solo questo

super.onBackPressed();

2
Questa chiamata termina l'attività corrente, quindi mostrerà l'ultima attività visibile. Tuttavia, se non vi è alcuna attività precedente o viene distrutta nel frattempo, l'applicazione potrebbe uscire.
r1k0,

22
Questo è hacker. Non dovresti chiamarlo direttamente. Questo è uno dei metodi del ciclo di vita e dovrebbe essere chiamato dal sistema Android.
Dheeraj Bhaskar,

33
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

Questo ti porterà a un'attività precedente mantenendo il suo stack e cancellando tutte le attività dopo di esso dallo stack.

Ad esempio, se lo stack era A-> B-> C-> D e inizi B con questo flag, lo stack sarà A-> B


Questo è ciò che funziona dalla mia parte. Mi piacerebbe scoprire cosa farebbe in modo che finish () non funzionasse.
Relm

20

Vuoi prendere il controllo del comportamento del pulsante Indietro? È possibile ignorare il pulsante Indietro (per passare a un'attività specifica) tramite uno dei due metodi.

Per Android 1.6 e versioni precedenti:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
        // do something on back.
        return true;
    }

    return super.onKeyDown(keyCode, event);
}

O se stai supportando solo Android 2.0 o versioni successive:

@Override
public void onBackPressed() {
    // do something on back.
    return;
}

Per maggiori dettagli: http://android-developers.blogspot.com/2009/12/back-and-other-hard-keys-three-stories.html


19

Basta chiamare questo metodo per terminare l'attività corrente o per tornare indietro su onBackPressed

finish();

O

onBackPressed();

Sto facendo in modo che l'utente esegua molte attività una dopo l'altra attraverso gli intenti. Devo fare qualcosa per assicurarmi che l'app non si blocchi con troppe attività in pila? Grazie!
Ruchir Baronia,

13

se vuoi andare vuoi solo andare all'attività precedente usare

finish();

O

onBackPressed();

se vuoi passare alla seconda attività o al di sotto che usi quanto segue:

intent = new Intent(MyFourthActivity.this , MySecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
//Bundle is optional
Bundle bundle = new Bundle();
bundle.putString("MyValue1", val1);
intent.putExtras(bundle);
//end Bundle
startActivity(intent);

1
Ho scoperto che finish () e onBackPressed () funzionano entrambi, ma, almeno nella mia app, finish () è molto lento e onBackPressed () è molto più veloce. Curioso.
scrayne,

Sto facendo in modo che l'utente esegua molte attività una dopo l'altra attraverso gli intenti. Devo fare qualcosa per assicurarmi che l'app non si blocchi con troppe attività in pila? Grazie!
Ruchir Baronia,

13

Aggiungi questo nel tuo metodo onCLick (), tornerà alla tua attività precedente

finire();

oppure puoi usarlo. Ha funzionato perfettamente per me

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

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

  return super.onOptionsItemSelected(item);
  }

11

Se hai configurato correttamente il file AndroidManifest.xml con parent attività, puoi utilizzare:

NavUtils.navigateUpFromSameTask(this);

Dove si trova l'attività di tuo figlio.


8

Prova questo è agire come devi premere il pulsante indietro

finish();
onBackPressed();


7

Ho lo stesso problema e

finish();  OR super.onBackPressed();

ha funzionato bene per me, entrambi hanno funzionato allo stesso modo, ma senza fortuna return


6

Inizia la seconda attività usando l'intento (o usa startActivityo startActivityForResultsecondo i tuoi requisiti). Ora quando l'utente preme il pulsante Indietro, l'attività corrente in alto verrà chiusa e verrà mostrata la precedente.

Ora diciamo che hai due attività, una per selezionare alcune impostazioni per l'utente, come lingua, paese ecc. E dopo averlo selezionato, l'utente fa clic sul pulsante Avanti per andare al modulo di accesso (ad esempio). Ora se l'accesso ha esito negativo, l'utente sarà sull'attività di accesso, e se l'accesso ha esito positivo?

Se l'accesso ha esito positivo, è necessario avviare un'altra attività. Significa che verrà avviata una terza attività e sono ancora in corso due attività. In questo caso, sarà buono da usare startActivityForResult. Quando l'accesso ha esito positivo, inviare nuovamente i dati OK alla prima attività e chiudere l'attività di accesso. Ora, quando i dati vengono ricevuti, avvia la terza attività e chiudi la prima attività utilizzando finish.


Sto facendo in modo che l'utente esegua molte attività una dopo l'altra attraverso gli intenti. Devo fare qualcosa per assicurarmi che l'app non si blocchi con troppe attività in pila? Grazie!
Ruchir Baronia,

5

Puoi provare questo:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {

        finish();
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

4

Tutte le nuove attività / intenzioni per impostazione predefinita hanno un comportamento indietro / precedente, a meno che non sia stata codificata a finish()sull'attività chiamante.


4
@Override
public void onBackPressed() {
    super.onBackPressed();
}

e se si desidera sul pulsante, fare clic su Indietro, quindi basta inserire

bbsubmit.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        onBackPressed();
    }
});

3
 @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 .


2

Suggerisco NavUtils.navigateUpFromSameTask (), è facile e molto semplice, puoi impararlo dallo sviluppatore di Google. Vorrei poterti aiutare!


1

Esistono pochi casi per tornare alla tua attività precedente:

Caso 1: se vuoi riportare il risultato alla tua attività precedente, allora ActivityA.java

 Intent intent = new Intent(ActivityA.this, FBHelperActivity.class);
               startActivityForResult(intent,2);

FBHelperActivity.java

 Intent returnIntent = new Intent();
 setResult(RESULT_OK, returnIntent);
 finish();

Caso 2: Attività A -> FBHelperActivity ----> AttivitàA

ActivityA.java

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

FBHelperActivity.java

after getting of result call finish();
 By this way your second activity will finish and because 
 you did not call finish() in your first activity then
 automatic first activity is in back ground, will visible.

1

Innanzitutto, tieni presente che, se vuoi tornare a un'attività precedente. Quindi non chiamare il metodo finish () quando si passa a un'altra attività usando Intent.

Dopo di che hai due modi per tornare dall'attività corrente all'attività precedente:

Basta chiamare: finish()sotto il pulsante listener dei clic, oppure Sovrascrivi il seguente metodo per tornare indietro usando il pulsante Indietro del sistema:

@Override
public void onBackPressed() {
    super.onBackPressed();
}

0

Oltre a tutte le risposte menzionate, il loro è ancora un modo alternativo per farlo, diciamo che hai due classi, classe A e classe B.

Classe A hai effettuato alcune attività come la casella di controllo seleziona, stampato alcuni dati e intendi la classe B. Classe B, desideri passare più valori alla classe A e mantenere lo stato precedente della classe A, puoi utilizzare, prova questa alternativa metodo o scarica il codice sorgente per dimostrarlo

http://whats-online.info/science-and-tutorials/125/Android-maintain-the-previous-state-of-activity-on-intent/

o

http://developer.android.com/reference/android/content/Intent.html


0

Prova questo nella prima attività

Intent mainIntent = new Intent(Activity1.this, Activity2.class);
this.startActivity(mainIntent);

Nella tua seconda attività

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

continua a bloccarsi, i dati non persistono credo
john ktejik
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.