Android: Zurück zur vorherigen Aktivität

524

Ich möchte etwas einfaches auf Android App machen. Wie ist es möglich, zu einer vorherigen Aktivität zurückzukehren?

Welchen Code brauche ich, um zur vorherigen Aktivität zurückzukehren?

Troj
quelle
5
Verfolgen Sie die letzte offene Aktivität
Vuk
53
Sie rufen einfach finish () auf; Prost
Nguyen Minh Binh
super.finish (); wenn Sie es innerhalb der Aktivität anrufen!
happyhardik
5
Eine Frage hier: Wenn Android die vorherige Aktivität aufgrund von weniger Speicher oder anderen Problemen zerstört hat, ist diese Aktivität nicht mehr im Backstack vorhanden und was passiert dann?
Sonniger
@ Sunny Ich gehe davon aus, dass der Garbage Collector mit der obersten Aktivität im Stapel beginnt. Wenn es also keine vorherige Aktivität gibt, gibt es auch keine aktuelle Aktivität. Aber ich gehe einfach davon aus, dass dieses Verhalten sinnvoller wäre, als Speicher in einem Stapel ohne eine bestimmte Reihenfolge freizugeben. Korrigieren Sie meinen Kommentar, wenn jemand es genau weiß.
Sedat Kilinc

Antworten:

486

Android-Aktivitäten werden im Aktivitätsstapel gespeichert. Die Rückkehr zu einer früheren Aktivität kann zwei Dinge bedeuten.

  1. Sie haben die neue Aktivität von einer anderen Aktivität aus mit startActivityForResult geöffnet . In diesem Fall können Sie einfach die Funktion finishActivity () aus Ihrem Code aufrufen und kehren zur vorherigen Aktivität zurück.

  2. Behalten Sie den Aktivitätsstapel im Auge. Wann immer Sie eine neue Aktivität mit einer Absicht starten, können Sie ein Absichtsflag wie FLAG_ACTIVITY_REORDER_TO_FRONToder angeben FLAG_ACTIVITY_PREVIOUS_IS_TOP. Sie können dies verwenden, um zwischen den Aktivitäten in Ihrer Anwendung zu wechseln. Ich habe sie aber nicht viel benutzt. Schauen Sie sich die Flags hier an: http://developer.android.com/reference/android/content/Intent.html

Wie in den Kommentaren erwähnt, kann man die Aktivität mit startActivity()schließen , wenn sie mit geöffnet wird finish(). Wenn Sie die Aufwärts - Taste verwenden möchten , können Sie das in fangen onOptionsSelected(MenuItem item)Verfahren mit der Überprüfung der Artikel - ID gegen android.R.id.homeanders als R.id.homewie in den Kommentaren erwähnt.

Abhinav
quelle
237
Oder wenn Sie die Aktivität mit startActivity () geöffnet haben, können Sie sie mit finish () schließen (Sie müssen keinen Parameter übergeben)
neworld
3
Können Sie klarstellen, wo und wie Sie finish () verwenden
?
4
@RicNjesh Wenn in Ihrer onOptionsItemSelected-Methode das angeklickte Menü die ID R.id.home hat, rufen Sie finish () auf. Es schließt die aktuelle Aktivität und bringt Sie zurück zu der Aktivität, die sie mit startActivity () gestartet hat
Anders Ullnæss
Ich lasse den Benutzer viele Aktivitäten nacheinander durch Absichten ausführen. Muss ich etwas tun, um sicherzustellen, dass die App nicht mit zu vielen Aktivitäten auf dem Stapel abstürzt? Vielen Dank!
Ruchir Baronia
1
Sind Sie sicher, dass Aktivität 1 nicht irgendwann stirbt, bevor Sie Aktivität 2 beendet haben?
user924
225

Versuchen Sie es Activity#finish(). Dies ist mehr oder weniger das, was die Zurück-Schaltfläche standardmäßig tut.

adamp
quelle
1
Warum #? oder ist es ein Punkt?
Nabin
8
Ich glaube, er meintethis.finish();
Jens Bodal
69
Dies #ist ein Indikator, der finish()eine nicht statische Methode der Aktivitätsklasse ist. Es ist kein gültiges Java, aber es hilft zu erklären, wie man die Methode verwenden könnte.
Bryan Herbst
2
@ Tanis.7x Gibt es einen Indikator für statische Methoden?
Benten
8
@Benten das wäre ., dh:Activity.someStaticMethod()
JonnyReeves
81

Schreiben Sie einfach auf "Fertig stellen" () . Sie gelangen zur vorherigen Aktivität.

Umer Rana
quelle
1
Obwohl onBackPressed () ebenfalls funktioniert, ist diese Lösung meiner Meinung nach besser geeignet, um über das Beenden einer Aktivität nachzudenken, die Sie nur für kurze Zeit benötigen. In meinem Fall z. B. OCR-Scanner. Vielen Dank!
Gene Bo
Dies befriedigt mein Bedürfnis. Danke.
Roon13
68

Nur das

super.onBackPressed();
AtanuCSE
quelle
2
Dieser Aufruf beendet gerade die aktuelle Aktivität, sodass die letzte sichtbare Aktivität angezeigt wird. Wenn jedoch keine vorherige Aktivität vorhanden ist oder diese in der Zwischenzeit zerstört wird, wird die Anwendung möglicherweise beendet.
r1k0
22
Das ist hackisch. Sie sollten dies nicht direkt anrufen. Dies ist eine der Lebenszyklusmethoden und sollte vom Android-System aufgerufen werden.
Dheeraj Bhaskar
33
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

Dadurch gelangen Sie zu einer vorherigen Aktivität, bei der der Stapel beibehalten und alle nachfolgenden Aktivitäten vom Stapel gelöscht werden.

Wenn der Stapel beispielsweise A-> B-> C-> D war und Sie B mit diesem Flag starten, ist der Stapel A-> B.

Dmitry Ryadnenko
quelle
Das ist es, was an meinem Ende funktioniert. Würde gerne herausfinden, was dazu führen würde, dass finish () nicht funktioniert.
Relm
20

Möchten Sie die Kontrolle über das Verhalten der Zurück-Schaltfläche übernehmen? Sie können die Zurück-Schaltfläche (um zu einer bestimmten Aktivität zu gelangen) über eine von zwei Methoden überschreiben.

Für Android 1.6 und niedriger:

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

Oder wenn Sie nur Android 2.0 oder höher unterstützen:

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

Für weitere Informationen: http://android-developers.blogspot.com/2009/12/back-and-other-hard-keys-three-stories.html

Bryan Denny
quelle
19

Rufen Sie einfach diese Methode auf, um die aktuelle Aktivität zu beenden oder mit onBackPressed zurückzukehren

finish();

ODER

onBackPressed();
Akshay Paliwal
quelle
Ich lasse den Benutzer viele Aktivitäten nacheinander durch Absichten ausführen. Muss ich etwas tun, um sicherzustellen, dass die App nicht mit zu vielen Aktivitäten auf dem Stapel abstürzt? Vielen Dank!
Ruchir Baronia
13

Wenn Sie gehen möchten, um nur zur vorherigen Aktivität zu gehen, verwenden Sie

finish();

ODER

onBackPressed();

Wenn Sie zur zweiten Aktivität oder darunter wechseln möchten, verwenden Sie Folgendes:

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);
Ram G.
quelle
1
Ich habe festgestellt, dass finish () und onBackPressed () beide funktionieren, aber zumindest in meiner App ist finish () sehr langsam und onBackPressed () ist viel schneller. Neugierig.
Scrayne
Ich lasse den Benutzer viele Aktivitäten nacheinander durch Absichten ausführen. Muss ich etwas tun, um sicherzustellen, dass die App nicht mit zu vielen Aktivitäten auf dem Stapel abstürzt? Vielen Dank!
Ruchir Baronia
13

Fügen Sie dies in Ihre onCLick () -Methode ein, um zu Ihrer vorherigen Aktivität zurückzukehren

Fertig();

oder Sie können dies verwenden. Es hat perfekt für mich funktioniert

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

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

  return super.onOptionsItemSelected(item);
  }
Darshuu
quelle
11

Wenn Sie die Datei AndroidManifest.xml mit übergeordneter Aktivität korrekt eingerichtet haben, können Sie Folgendes verwenden:

NavUtils.navigateUpFromSameTask(this);

Wo dies Ihre Kinderaktivität ist.

Thomas Decaux
quelle
8

Versuchen Sie dies, indem Sie die Zurück-Taste drücken

finish();
onBackPressed();
Muhammed Fasil
quelle
7

Habe das gleiche Problem und

finish();  OR super.onBackPressed();

hat gut funktioniert für mich, beide haben gleich funktioniert, aber kein Glück mit return

Kein Name
quelle
6

Starten Sie die zweite Aktivität mit Absicht (entweder verwenden startActivityoder startActivityForResultgemäß Ihren Anforderungen). Wenn der Benutzer die Zurück-Taste drückt, wird die aktuelle Aktivität oben geschlossen und die vorherige angezeigt.

Nehmen wir an, Sie haben zwei Aktivitäten, eine zum Auswählen einiger Einstellungen für den Benutzer, wie Sprache, Land usw., und nach der Auswahl klickt der Benutzer auf die Schaltfläche Weiter, um zum Anmeldeformular zu gelangen (zum Beispiel). Wenn die Anmeldung nicht erfolgreich ist, befindet sich der Benutzer in der Anmeldeaktivität. Was passiert, wenn die Anmeldung erfolgreich ist?

Wenn die Anmeldung erfolgreich ist, müssen Sie eine andere Aktivität starten. Dies bedeutet, dass eine dritte Aktivität gestartet wird und noch zwei Aktivitäten ausgeführt werden. In diesem Fall ist es gut zu verwenden startActivityForResult. Wenn die Anmeldung erfolgreich ist, senden Sie OK-Daten an die erste Aktivität zurück und schließen Sie die Anmeldeaktivität. Wenn die Daten empfangen werden, starten Sie die dritte Aktivität und schließen Sie die erste Aktivität mit finish.

Altaf Hussain
quelle
Ich lasse den Benutzer viele Aktivitäten nacheinander durch Absichten ausführen. Muss ich etwas tun, um sicherzustellen, dass die App nicht mit zu vielen Aktivitäten auf dem Stapel abstürzt? Vielen Dank!
Ruchir Baronia
5

Sie können dies versuchen:

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

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

Alle neuen Aktivitäten / Absichten haben standardmäßig das Verhalten "Zurück" / "Zurück", es sei denn, Sie haben eine finish()für die aufrufende Aktivität codiert .

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

und wenn Sie auf die Schaltfläche klicken möchten, gehen Sie zurück und setzen Sie sie einfach ein

bbsubmit.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        onBackPressed();
    }
});
Md Hussain
quelle
3
 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
      int id = item.getItemId();

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

      return super.onOptionsItemSelected(item);
 }

Versuchen Sie dies, es funktioniert sowohl auf der Symbolleisten-Zurück-Schaltfläche als auch auf der Hardware-Zurück-Schaltfläche .

Puni
quelle
2

Ich schlage die NavUtils.navigateUpFromSameTask () vor, sie ist einfach und sehr einfach. Sie können sie vom Google-Entwickler lernen. Ich wünschte, ich könnte Ihnen helfen!

Wuxue
quelle
1

Es gibt nur wenige Fälle, in denen Sie zu Ihrer vorherigen Aktivität zurückkehren können:

Fall 1: Wenn Sie das Ergebnis zu Ihrer vorherigen Aktivität zurückführen möchten, klicken Sie auf ActivityA.java

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

FBHelperActivity.java

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

Fall 2: AktivitätA -> FBHelperActivity ----> AktivitätA

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.
Gyan Swaroop Awasthi
quelle
1

Beachten Sie zunächst Folgendes, wenn Sie zu einer vorherigen Aktivität zurückkehren möchten. Rufen Sie dann nicht die Methode finish () auf, wenn Sie mit Intent zu einer anderen Aktivität wechseln.

Danach haben Sie zwei Möglichkeiten, von der aktuellen Aktivität zur vorherigen Aktivität zurückzukehren:

Rufen Sie einfach an: finish()Klicken Sie unter der Schaltfläche auf den Listener, oder überschreiben Sie die folgende Methode, um mit der Schaltfläche "System zurück" zurückzusetzen:

@Override
public void onBackPressed() {
    super.onBackPressed();
}
Monir Zzaman
quelle
0

Neben all den genannten Antworten ist dies immer noch eine alternative Möglichkeit. Nehmen wir an, Sie haben zwei Klassen, Klasse A und Klasse B.

Klasse A Sie haben einige Aktivitäten wie das Aktivieren des Kontrollkästchens vorgenommen, einige Daten und Absichten für Klasse B ausgedruckt. Klasse B, Sie möchten mehrere Werte an Klasse A übergeben und den vorherigen Status von Klasse A beibehalten. Sie können diese Alternative verwenden Methode oder Quellcode herunterladen, um dies zu demonstrieren

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

oder

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

Daniel Nyamasyo
quelle
0

Probieren Sie dies einfach in der ersten Aktivität aus

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

In Ihrer zweiten Aktivität

@Override
public void onBackPressed() {
    this.finish();
}
byteC0de
quelle
stürzt immer wieder ab, Daten bleiben nicht erhalten Ich denke
John Ktejik