wake-up-neo.com

Wie lösche ich den Android-Stack von Aktivitäten?

Ich habe eine Anwendung mit mehreren Aktivitäten in Android und möchte, dass sich der Benutzer durch Drücken einer Menütaste abmelden kann. Das Problem, das ich habe, ist das

A) Android lässt Sie die Anwendung nicht beenden und
B) Auch wenn ich den Benutzer erneut an die Variable LoginActivity schicke, kann er immer back drücken und direkt zur vorherigen Aktivität zurückkehren, in der er sich befand.

Ich habe bereits versucht, die Aktivität mit den beiden folgenden Flags zu starten: 

Intent intent  = new Intent(this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);        
startActivity(intent);

Ich habe es auch mit jedem von ihnen selbst versucht.

Ich habe auch versucht, finish() nach startActivity(intent) aufzurufen, während ich in einer anderen StackOverflow -Frage las.

53
Totic

Überschreiben Sie in Ihrer Anmeldeaktivität die Zurück-Schaltfläche, damit Ihre App ausgeblendet wird, anstatt die Aktivität zu beenden:

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

Stellen Sie außerdem sicher, dass Android: alwaysRetainTaskState = "true" für die Stammaktivität festgelegt ist, damit Android Ihren Stack (einschließlich der Anmeldeaktivität) nach 30 Minuten Inaktivität des Benutzers nicht löscht.

Dann rufen Sie einfach finish () auf, wenn der Login erfolgreich ist.

35
Tenfour04

Dies sollte bitweise ODER sein oder Sie überschreiben das frühere Flag.

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

So wie:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
42
deweylewie

Per Wakka in Entfernen einer Aktivität aus dem Historienstapel ...


Fügen Sie das Android:noHistory="true"-Attribut wie folgt zu Ihrem <activity> im AndroidManifest.xml hinzu:

<activity Android:name=".MyActivity"
    Android:noHistory="true">
</activity>
31

Wenn Sie Android API 11 oder höher verwenden, können Sie den Stapel mit dem folgenden Code löschen. 

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
6
matangs

Dadurch wird dein Aktivitätsstapel nicht gelöscht.

Auch nachdem ich alle obigen Antworten befolgt hatte, als ich die Zurück-Taste drückte, wurde die letzte Aktivität für eine Sekunde angezeigt, bevor die App geschlossen wurde.

Das habe ich gemacht:

@Override
public void onBackPressed() { 
    Intent startMain = new Intent(Intent.ACTION_MAIN);
    startMain.addCategory(Intent.CATEGORY_HOME);
    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(startMain);
}

Jetzt endet meine App auf Back Press :) ohne Probleme.

5
amalBit

Die Einstellung von Intent.FLAG_ACTIVITY_CLEAR_TOP hat für mich in einem sehr ähnlichen Fall funktioniert, wo ich das Intent.FLAG_ACTIVITY_NEW_TASK-Flag nicht gesetzt habe. Hast du es ohne probiert?

3
Brandon

Diese Arbeit für mich :)

Intent main = new Intent(this, A_Activity.class);
main.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
    | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(main);

Intent tool = new Intent(this, B_Activity.class);
startActivity(tool);
finish();

Wobei A meine Stammaktivität ist 

Ich habe Aktivitäten A -> B -> C -> D, wenn ich die Startaktivität E auf Stapel anrufe

Ich weiß nicht, ob es gut ist :) aber es funktioniert.

2
Dawid Drozd
Intent intent  = new Intent(this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);        
startActivity(intent);

schreiben Sie dies und beachten Sie: LoginActivity muss zuerst als Launcher und gestartet werden 

wenn Sie Launcher-Modi schreiben, werden die Flags mit ihrem Zweck überschrieben. Entfernen Sie also die Variable launchermode und versuchen Sie, sie zu bekommen

1
Anand Kumar

Versuche dies

Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(
    Intent.FLAG_ACTIVITY_CLEAR_TOP | 
    Intent.FLAG_ACTIVITY_CLEAR_TASK | 
    Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
1
Raghavendra

Wenn wir diesen Code verwenden, um die Login-Aktivität (A) zu starten:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);

Die Aktivität sollte sich im Stapel von Aktivitäten befinden, andernfalls haben diese Flags keine Auswirkungen. 

Wenn wir in der Login-Aktivität (A) finish () verwenden, wird nach dem Start der Aktivität (B) (um zu vermeiden, von A nach A zurückzukehren) die Aktivität A (Login) nicht im Stack. Genau das gleiche passiert, wenn die Login-Aktivität "noHistory" als Attribut hat.

Die Lösung für mich war also eine Mischung aus anderen Antworten:

Dieser Code geht in die Aktivität B, um zu vermeiden, dass die Login-Aktivität zurückkehrt:

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

Und dieser Code geht in die Aktivität, die die Logout-Funktion aufruft:

public static void logout() {
    Intent intent = new Intent(activity, LoginMain.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);
}
0
Mario Velasco