Wie kann verhindert werden, dass zur vorherigen Aktivität zurückgekehrt wird?

209

Wenn die Taste ZURÜCK am Telefon gedrückt wird, möchte ich verhindern, dass eine bestimmte Aktivität zu ihrer vorherigen zurückkehrt.

Insbesondere habe ich Anmelde- und Anmeldebildschirme. Beide starten eine neue Aktivität, die aufgerufen wird, HomeScreenwenn eine erfolgreiche Anmeldung / Anmeldung erfolgt. Nach dem Start von HomeScreen möchte ich verhindern, dass die Benutzer durch Drücken der Taste ZURÜCK zum Anmelde- oder Anmeldebildschirm zurückkehren können.

Ich habe es versucht Intent.FLAG_ACTIVITY_NO_HISTORY, aber da die Anwendung über eine Facebook-Integration verfügt, sollte Facebook bei Verwendung von "Mit Facebook anmelden" zum ursprünglichen Anmeldebildschirm zurückkehren und daher einen Verlauf dieser Aktivitäten führen.

Ich dachte daran, das Verhalten der Schaltfläche ZURÜCK zu überschreiben HomeScreen, um eine Anwendung direkt zu beenden, wenn die Schaltfläche gedrückt und verwendet wird

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

das geht aber auch nicht.

ecem
quelle
1
Um dies zu verdeutlichen, versuchen Sie, das Verhalten für alle außer Facebook zu erfassen?
Havexz
2
In gewissem Sinne ja, aber eigentlich möchte ich nach einer erfolgreichen Anmeldung und dem Öffnen des HomeScreen nicht, dass der Benutzer durch Drücken der Taste ZURÜCK zum Anmeldebildschirm zurückkehren kann. Genau wie bei Twitter oder Foursquare wird nach dem Anmelden bei diesen Apps die Anmeldeseite erst angezeigt, wenn wir uns abmelden (auch wenn wir nach dem Anmelden auf ZURÜCK drücken).
ecem

Antworten:

345

Mein Vorschlag wäre, die Aktivität zu beenden, zu der die Benutzer nicht zurückkehren sollen. Rufen Sie beispielsweise in Ihrer Anmeldeaktivität direkt nach Ihrem startActivityAnruf an finish(). Wenn die Benutzer auf die Schaltfläche "Zurück" klicken, können sie nicht zur Anmeldeaktivität wechseln, da diese vom Stapel entfernt wurde.

Codierer
quelle
2
Was ist, wenn der Thread in der vorherigen Aktivität weiterhin ausgeführt werden soll?
AlleyOOP
2
Dann würden Sie nicht mit meinem Ansatz gehen wollen. Wenn Sie finish () aufrufen, wird die Aktivität beendet. Könnten Sie Ihren Prozess starten, den Sie in der Aktivität ausführen möchten, die Sie ausführen möchten?
Codierer
7
Hinweis: Wenn Sie finishwährend eines gemeinsamen Übergangs anrufen , wird möglicherweise die vorherige Aktivität durchgebrannt. zB wenn Sie HomeActivity-> IntermediateActivity-> FinalActivityund rufen Sie finish()in der IntermediateActivityunmittelbar nach dem Start der FinalActivitySie das sehen werden HomeActivityfür einen kurzen Moment.
David Murdoch
101

Die folgende Lösung kann im üblichen Anmelde- / Hauptaktivitätsszenario oder bei der Implementierung eines Sperrbildschirms sehr nützlich sein.

Um die App zu minimieren, anstatt zur vorherigen Aktivität zurückzukehren, können Sie Folgendes überschreiben onBackPressed():

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

moveTaskToBack(boolean nonRoot)Lässt Ihren Backstack so wie er ist, stellt Ihre Aufgabe (alle Aktivitäten) einfach in den Hintergrund. Gleich wie wenn der Benutzer die Home-Taste gedrückt hat .

Parameter boolean nonRoot- Wenn false, funktioniert dies nur, wenn die Aktivität die Wurzel einer Aufgabe ist. Wenn dies der Fall ist, funktioniert es für jede Aktivität in einer Aufgabe.

Marcel Bro
quelle
3
Perfekt für einen Anmeldebildschirm, da der Verlauf intakt bleibt.
Hackmodford
Danke, ich habe drei Tage lang versucht, das zu finden. Wegen Android: noHistory = "true" -Flag für Aktivität funktioniert nicht wie erwartet (noHistory-Flag erstellt Aktivität nach Minimierung neu) und finish () hat manchmal bei mir nicht funktioniert, aber warum habe ich es immer noch nicht verstanden.
Denshov
37

Ich bin mir nicht sicher, was Sie genau wollen, aber es klingt so, als ob es möglich sein sollte, und es klingt auch so, als wären Sie bereits auf dem richtigen Weg.

Hier sind einige Links, die helfen könnten:

Deaktivieren Sie die Zurück-Schaltfläche in Android

  MyActivity.java =>
    @Override
    public void onBackPressed() {

       return;
    }

Wie kann ich das Zurückkehren zu einer Aktivität deaktivieren?

  AndroidManifest.xml =>
<activity android:name=".SplashActivity" android:noHistory="true"/>
paulsm4
quelle
1
Ich kann die Option noHistory aufgrund des Facebook-Problems, das ich in meiner Frage und auch in einem der Kommentare zu erklären versucht habe, nicht verwenden. Die Sache mit der Schaltfläche ZURÜCK ist jedoch nicht, dass sie deaktiviert wird, sondern dass das Beenden der gesamten Anwendung wie System.exit(0)folgt aufgerufen wird (ich weiß, dass dies nicht die beste Vorgehensweise ist, aber ich wollte nur ein Beispiel geben).
ecem
Danke, das hat super funktioniert. Der einzige Vorschlag, den ich hier machen würde, wäre, dass keine Rückgabe erforderlich ist. Entfernen Sie einfach super.onBackPressed () und lassen Sie die Methode leer. Das funktioniert auch gut
HyperCoder
19

Für Ihren Fall gibt es zwei Lösungen: Aktivität A startet Aktivität B, Sie möchten jedoch nicht zu Aktivität A in Aktivität B zurückkehren.

1. Vorherige Aktivität A vom Backstack entfernt.

    Intent intent = new Intent(activityA.this, activityB.class);
    startActivity(intent);
    finish(); // Destroy activity A and not exist in Back stack

2. Deaktiviert die Aktion "Zurück" in Aktivität B.

Es gibt zwei Möglichkeiten, um ein Zurück-Ereignis zu verhindern:

1) Ansatz empfehlen

@Override
public void onBackPressed() {
}

2) OnKeyDown-Methode überschreiben

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(keyCode==KeyEvent.KEYCODE_BACK) {
        return false;
    }
    return super.onKeyDown(keyCode, event);
}

Hoffe, dass es nützlich ist, aber immer noch von Ihren Situationen abhängt.

Luna Kong
quelle
3
Ist es nicht eine schlechte Benutzererfahrung, onBackPressed () zu deaktivieren?
C. Skjerdal
Es hängt ganz davon ab, was Sie machen möchten. In der App-Funktionalität muss dies dann erledigt werden.
user3099225
Es ist erstaunlich, wie ich die erste Methode völlig vergessen habe finish(). Unnötig überlegt mit nohistoryAttributen, Absichtsflags, Manifest-Tags für übergeordnete Aktivitäten usw.! Dumm, danke für die Antwort!
Varun
8

Da bereits viele großartige Lösungen vorgeschlagen wurden, versuche ich, eine dipiktivere Erklärung zu geben.

Wie zu überspringen , um zur vorherigen Aktivität zurück?

Entfernen Sie die vorherige Aktivität aus dem Backstack. Einfach

Wie entferne ich die vorherige Aktivität aus dem Backstack?

finish()Methode aufrufen

Der normale Fluss:

Geben Sie hier die Bildbeschreibung ein
Alle Aktivitäten werden in einem Stapel gespeichert, der als Backstack bezeichnet wird.
Wenn Sie eine neue Aktivität ( startActivity(...)) starten, wird die neue Aktivität an den oberen Rand des Stapels verschoben, und wenn Sie die Zurück-Taste drücken, wird die Aktivität aus dem Stapel entfernt.
Ein wichtiger Punkt ist, dass beim Drücken der Zurück-Taste die finish();Methode intern aufgerufen wird. Dies ist das Standardverhalten der onBackPressed () -Methode.

Wenn Sie also Aktivität B überspringen möchten?

dh A <--- C.

Fügen Sie einfach die finish();Methode nach Ihrer startActvity(...)in Aktivität B hinzu

Intent i = new Intent(this, C.class);
startActivity(i);
finish();

Geben Sie hier die Bildbeschreibung ein

Rohit Singh
quelle
6

finish()gibt Ihnen die Methode, um die aktuelle Aktivität nicht die gesamte Anwendung zu schließen. Und Sie sollten besser nicht nach Methoden suchen, um Anwendungen zu beenden. Kleiner Rat.

Haben Sie versucht, Konjunktion von Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_NO_HISTORY? Denken Sie daran, diese Flags beim IntentStarten der Aktivität zu verwenden!

Cadavre
quelle
2
FLAG_ACTIVITY_NO_HISTORYverhindert, dass mein LoginScreen den Rückruf von Facebook erfasst, wenn Login mit Facebook verwendet wird. Denn sobald der Fokus vom LoginScreen ausgeht, kann er nicht mehr fortgesetzt werden (da kein Verlauf vorhanden ist). Aber ich habe es nicht ausprobiert Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS, ich werde es überprüfen, danke!
ecem
auch danke über die finish()Methode, ich wusste nichts davon.
ecem
4

Setzen Sie finish()gleich danach

Intent i = new Intent(Summary1.this,MainActivity.class);
            startActivity(i);
finish();
Param Trivedi
quelle
1
Dies ist im Grunde, was die akzeptierte Antwort von vier Jahren zuvor sagte.
TylerH
3

Die Antwort von paulsm4 ist die richtige. Wenn onBackPressed()Sie gerade zurückkehren, wird die Zurück-Schaltfläche deaktiviert. Ich denke jedoch, dass ein besserer Ansatz in Anbetracht Ihres Anwendungsfalls darin besteht, die Aktivitätslogik umzudrehen, dh Ihre Heimaktivität zur Hauptaktivität zu machen und zu überprüfen, ob der Benutzer dort angemeldet ist. Wenn nicht, starten Sie die Anmeldeaktivität. Der Grund dafür ist, dass die meisten Benutzer verwirrt sind, wenn Sie die Zurück-Schaltfläche in Ihrer Hauptaktivität überschreiben, wenn sie zurück drücken und Ihre App nichts tut.

dmon
quelle
3

Diese Methode funktioniert gut

Intent intent = new Intent(Profile.this, MainActivity.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);
Pulak
quelle
2

Überschreiben Sie einfach die onKeyDown-Methode und prüfen Sie, ob die Zurück-Taste gedrückt wurde.

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) 
{
    if (keyCode == KeyEvent.KEYCODE_BACK) 
    {
        //Back buttons was pressed, do whatever logic you want
    }

    return false;
}
Maschinenstamm
quelle
1
@Override
public void onBackPressed() {
}

Wenn Sie erstellen, onBackPressed()entfernen Sie einfach super.onBackPressed();und das sollte funktionieren

HyperCoder
quelle
1

Stellen

finish();

Unmittelbar nach ActivityStart, um die Aktivität zu stoppen und zu verhindern, dass Sie dorthin zurückkehren können. Dann füge hinzu

onCreate(){
    getActionBar().setDisplayHomeAsUpEnabled(false);
    ...
}

zu der Aktivität, die Sie starten.

Brandon Dyer
quelle