So schließen Sie die Aktivität und kehren zur vorherigen Aktivität in Android zurück


144

Ich habe eine Hauptaktivität: Wenn ich auf eine Schaltfläche klicke und eine neue Aktivität starte, habe ich dazu den folgenden Code verwendet:

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

Der obige Code wurde von der Hauptaktivität ausgeführt.

Jetzt habe ich in meiner neuen Aktivität, die von der Hauptaktivität aufgerufen wird, einen Zurück-Button. Wenn ich auf diese Zurück-Schaltfläche klicke, soll meine neue Aktivität geschlossen werden und zur ursprünglichen Hauptaktivität zurückkehren.

Ich habe versucht anzurufen super.finish()und nur finish() (von der neuen Aktivität), aber dies schließt dann meine gesamte Anwendung (einschließlich meiner Hauptaktivität).

Wie kann ich die aktuell fokussierte Aktivität einfach schließen und dann zur Hauptaktivität zurückkehren?

BEARBEITET

Die Tatsache, dass die Zurück-Taste meines Telefons auch meine gesamte App schließt, lässt mich denken, dass ich die zweite Aktivität falsch gestartet habe?


OK, ich habe gesucht,

Ich habe eine Einstellungsaktivität erstellt, die denselben Manifestcode und denselben Code zum Starten der Aktivität verwendet.

Bei den Einstellungen Aktivität kehrt die Hauptaktivität zurück, wenn ich die Zurück-Taste drücke.

Mit der oben in der Hauptfrage erwähnten Aktivität wird einfach meine gesamte App beendet.

Das Problem scheint also nicht der Code zum Beenden der Aktivität zu sein, sondern die Aktivität selbst.


4
Sie benötigen nicht einmal eine Zurück-Taste. Lassen Sie den Benutzer einfach die Zurück-Taste des Telefons verwenden, und Sie müssen nichts tun.
Hoan Nguyen

Die Schaltfläche "Zurück" des Telefons schließt die Eingabeanwendung, nicht nur meine sekundäre Aktivität. Ich möchte die Hauptaktivität nicht schließen.
Zapnologica

1
Die Schaltfläche "Zurück" sollte dies nicht tun - können Sie mehr von Ihrem Code anzeigen?
Peejaybee

Wenn Sie auf Ihre Bearbeitung reagieren, sieht die sekundäre Aktivität gut aus, was Sie gepostet haben. Ich denke, TGMCians hat wahrscheinlich die richtige Antwort und Sie untersuchen Ihr Manifest.
Peejaybee

siehe diese Antwort Ich denke, das wird dir helfen
Muhammad Helmi

Antworten:


201

Ich denke, Sie rufen die finish()Methode auf, MainActivitybevor Sie beginnen SettingsActivity.

Das von Ihnen beschriebene Szenario tritt auf zwei Arten auf:

ENTWEDER

Sie haben android:noHistory = "true"für MainActivityinnen eingestellt, AndroidManifest.xmlwas dazu führt MainActivity, dass finishbeim Drücken der Zurück-Taste automatisch.

ODER

Vor der Umstellung auf Ihren SettingsActivity ', haben Sie genannt finish()in Ihrem MainActivity, was sie tötet. Wenn Sie die Zurück-Taste drücken, kehrt der Hauptbildschirm zurück, da im Stapel keine andere Aktivität zum Popup voreingestellt ist.


Dies würde erklären, warum die Zurück-Taste des Telefons auch die Hauptaktivität abweist.
Peejaybee

Beim Debuggen ist mir aufgefallen, dass die Ausführung nach finish () fortgesetzt wird. Daher ist es ratsam, zusätzlich eine Rückgabe vorzunehmen.
Bis zum

Ist der dritte Grund in dieser Antwort nicht nur eine Wiederholung des ersten?
Pang

60

Sie können zur vorherigen Aktivität zurückkehren, indem Sie in der Aktivität, in der Sie sich befinden, einfach finish () aufrufen. Beachten Sie, dass jeder Code nach dem Aufruf von finish () ausgeführt wird. Sie können einfach nach dem Aufruf von finish () eine Rückgabe durchführen, um dies zu beheben.

Wenn Sie die Ergebnisse zu Aktivität 1 zurückgeben möchten, benötigen Sie beim Starten von Aktivität 2 Folgendes:

startActivityForResults(myIntent, MY_REQUEST_CODE);

Innerhalb Ihrer aufgerufenen Aktivität können Sie dann die Absicht über den Parameter onCreate () abrufen oder verwenden

getIntent();

Um ein Ergebnis festzulegen, geben Sie es in Aktivität eins zurück, dann in Aktivität zwei

setResult(Activity.RESULT_OK, MyIntentToReturn);

Wenn Sie nicht die Absicht haben zurückzukehren, sagen Sie einfach

setResult(Activity.RESULT_OK);

Wenn die Aktivität zu schlechten Ergebnissen führt, können Sie Activity.RESULT_CANCELED verwenden (dies wird standardmäßig verwendet). Dann machst du in Aktivität eins

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

Um Aktivität zwei zu beenden, verwenden Sie dieselben Methoden mit finish () wie oben beschrieben, wobei Ihre Ergebnisse bereits festgelegt sind.


1
"Beachten Sie, dass jeder Code nach dem Aufruf von finish () ausgeführt wird. Sie können nach dem Aufruf von finish () einfach eine Rückgabe durchführen, um dies zu beheben." Ich denke, 'fix' ist hier eine schlechte Wortwahl. Es ist eher so, als würden Sie die Ausführung der folgenden Zeilen vermeiden (nicht korrigieren).
Lo-Tan

14

Wenn Sie auf Ihre Schaltfläche klicken, können Sie sie aufrufen lassen:

super.onBackPressed();

11

Wenn Sie Fragment verwenden, sollten Sie verwenden

getActivity().onBackPressed();

Wenn Sie eine einzelne Aktivität verwenden, können Sie diese verwenden

finish();

7

Versuchen Sie diesen Code anstelle von finish:

onBackPressed();


2
Funktioniert gut für die Rückkehr von AktivitätB zu AktivitätA. Für Fragmente und einzelne Aktivitäten könnte die Antwort von @Osama Ibrahim verwendet werden.
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

Ich glaube, Ihre zweite Aktivität hängt wahrscheinlich nicht mit Ihrer Hauptaktivität als Kinderaktivität zusammen. Überprüfen Sie Ihre AndroidManifest.xmlDatei und prüfen Sie, ob der <activity>Eintrag für Ihre untergeordnete Aktivität ein android:parentActivityNameAttribut enthält. Es sollte ungefähr so ​​aussehen:

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

1

Rufen finish()Sie einfach nicht Ihren an, MainActivitydann entfällt die Notwendigkeit, Ihren onBackPressed()in Ihrem zu überschreiben, es SecondActivitysei denn, Sie tun andere Dinge in dieser Funktion. Wenn Sie die „Notwendigkeit“ für diese Back - Button fühlen , dann können Sie rufen Sie einfach finish()auf das SecondActivityund das wird Sie Ihren nehmen MainActivity, solange Sie nicht genannt haben finish()auf sie


Ich habe diese Route ausprobiert, aber ich habe ungefähr 10 Bildschirme nacheinander, die hochauflösende PNGs verwenden. Das Problem ist, dass das Gerät etwa auf Bildschirm 7 aufgrund aller Aktivitäten im Backstack keine Speicher mehr hat. Ich habe mich entschlossen, bei jeder Aktivität den Abschluss zu rufen, und dies hat das Problem behoben, indem die Speicherbereinigung zugelassen wurde. Jetzt muss das Back-Verhalten manuell codiert werden, da der Back-Stack jetzt leer ist. Sind Sie auf dieses Problem gestoßen oder kennen Sie Mechanismen in Android, um dieses Problem zu beheben?
Lo-Tan

Was soll der Zurück-Button tun? Zurück zu dem, was vorher Activitywar oder immer zurück zu dem MainActivity? Wenn Ihnen der Speicherplatz ausgeht Bitmaps, sollten Sie diesen Teil der Dokumentation lesen . Es hat mir geholfen
codeMagic

@ Lo-Tan Wenn Sie zur vorherigen Aktivität zurückkehren möchten, müssen Sie die Speicherverwaltung für Ihre Bilder herausfinden und die Aktivitäten nicht beenden (möglicherweise mit dem von mir angegebenen Link). Andernfalls müssen Sie eine neue Instanz der Aktivität neu erstellen und versuchen, herauszufinden, zu welcher Instanz Sie zurückkehren müssen
codeMagic

Ich möchte, dass die Zurück-Schaltfläche einfach zum vorherigen Bildschirm wechselt. Dies ist im Grunde eine Reihe von Tutorial-Bildschirmen, und der Benutzer kann vorwärts / rückwärts gehen. Jeder Bildschirm ist so konzipiert und verwendet viele PNGs - manchmal auch PNGs, die den größten Teil des Bildschirms einnehmen (nicht nur kleine Miniaturansichten), sodass für jeden Bildschirm viel Speicherplatz benötigt wird.
Lo-Tan

@ Lo-Tan Ich denke, Sie möchten die onBackPressed () -Methode überschreiben und dann einfach manuell die Aktivität erstellen, zu der Sie gehen möchten. Sie können dann diejenige beenden, auf der Sie sich befinden, und die vorherige starten.
Zapnologica

1

Ich weiß nicht, ob dies überhaupt nützlich ist oder nicht, aber ich hatte mit dem gleichen Problem zu kämpfen und fand einen ziemlich einfachen Weg, nur mit einer globalen booleschen Variablen und einer onResume () -Aktion. In meinem Fall sollte meine Aktivität C, wenn Sie auf eine bestimmte Schaltfläche klicken, das Ende () von Aktivität B auslösen!

Aktivität_A -> Aktivität_B -> Aktivität_C

Activity_A (öffnet normalerweise Activity_B)

Activity_B (bei einigen Schaltflächen öffnet sich 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();
     }
}

Wenn ich also auf die Schaltfläche in Aktivität C klicke, wird die Funktion "onResume ()" von Aktivität B ausgeführt und ich gehe zurück zu Aktivität 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);
    }

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


Dieser hat für mich gearbeitet. Ich hatte auch eine MainActivity und eine SettingsActivity mit android:parentActivityName=".MainActivity"für die zweite. Dieser Code behandelt diese Home / Back- Schaltfläche im Toolbat und beendet gerade die aktuelle Aktivität, die zur vorherigen im Stapel zurückkehrt. Vielen Dank.
Mortalis

1

Fertig stellen schließt die gesamte Anwendung, dies ist etwas, das ich in der Android-Entwicklung hasse, nicht fertig zu stellen, das ist in Ordnung, aber dass sie nicht mit der guten Syntax mithalten, die sie haben

startActivity(intent)

Warum nicht

closeActivity (Absicht)?


1
Beantwortet dies die Frage? Oder ist dies nur ein Vorschlag, den man ausprobieren sollte? In beiden Fällen ist das Geschwätz unnötig und wahrscheinlich nicht willkommen auf SO
Gilles Gouaillardet

1

Wir sind auf eine sehr ähnliche Situation gestoßen.

Aktivität 1 (Eröffnung) -> Aktivität 2 (Vorschau) -> Aktivität 3 (Detail)

Falsche Antwort "Zurück drücken"

  • Durch Zurückdrücken des Geräts auf Aktivität 3 wird auch Aktivität 2 geschlossen.

Ich habe alle oben geposteten Antworten überprüft und keine davon hat funktioniert. Die Java-Syntax für den Übergang zwischen Aktivität 2 und Aktivität 3 wurde auf Richtigkeit überprüft.

Frisch vom Codieren beim Aufrufen einer Drittanbieter-App. durch eine Aktivität. Wir haben uns entschlossen, den Konfigurationswinkel zu untersuchen, um schließlich die Hauptursache des Problems zu identifizieren.

Geltungsbereich : Konfiguration von Aktivität 2 (Anrufer).

Grundursache :

android:launchMode="singleInstance"

Lösung :

android:launchMode="singleTask"

Anscheinend berücksichtigt singleInstance in diesem Fall "on back press" aufgerufene Aktivitäten in einer Instanz mit der aufrufenden Aktivität, während singleTask es ermöglicht, dass aufgerufene Aktivitäten ihre eigene Identität haben, damit die beabsichtigte on back press so funktioniert, wie sie sollte.


0
{ getApplicationContext.finish();   }

Versuchen Sie diese Methode ..


Während dieser Codeblock die Frage beantworten kann, ist es am besten, wenn Sie eine kleine Erklärung dafür geben könnten, warum dies so ist.
David

0

Möglicherweise rufen Sie finish () auf. Wenn Sie auf die Schaltfläche klicken und die Hauptaktivität unmittelbar nach dem Klicken auf die Schaltfläche geschlossen wird, wird die Anwendung beendet, da die Hauptaktivität bereits geschlossen ist und keine aktive Aktivität vorhanden ist.


0

on onCreate Methode Ihrer Aktivität schreiben Sie den folgenden Code.

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

Überschreiben Sie dann die von onOptionsItem ausgewählte Methode Ihrer Aktivität wie folgt

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

Und du bist gut zu gehen.


0

Sie müssen dies in Ihrer MainActivity verwenden

 Intent intent = new Intent(context , yourActivity);

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

Das Flag startet mehrere Aufgaben, die Ihre Hauptaktivität beibehalten. Wenn Sie "Fertig stellen" aufrufen, wird die andere Aktivität beendet und Sie kehren zur Hauptaktivität zurück

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.