web-dev-qa-db-de.com

Android: Entfernen Sie alle vorherigen Aktivitäten vom Backstack

Wenn ich auf die Schaltfläche Abmelden in meinem Profil Aktivität klicke, möchte ich den Benutzer auf die Seite Anmelden bringen, auf der er neue Anmeldeinformationen verwenden muss.

Daher habe ich diesen Code benutzt:

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

in der onButtonClick der Schaltfläche Abmelden.

Das Problem ist jedoch, dass ich durch Klicken auf die Schaltfläche zum Zurückkehren des Geräts in der Anmeldeaktivität zur ProfileActivity komme. Ich hatte erwartet, dass die Anwendung geschlossen wird, wenn ich auf LoginActivity die Taste zum Zurückkehren des Geräts drücke.

Was mache ich falsch?

Ich habe auch Android:launchMode="singleTop" im Manifest für meine LoginActivity

Danke dir

100
Archie.bpgc

Die vorgeschlagene Lösung hier hat bei mir funktioniert:

Java

Intent i = new Intent(OldActivity.this, NewActivity.class);
// set the new task and clear flags
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);


Kotlin

val i = Intent(OldActivity.this, NewActivity::class.Java)
// set the new task and clear flags
i.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
startActivity(i)


Es erfordert jedoch API-Level> = 11.

262
kgiannakakis

Hier ist eine Lösung, um alle Aktivitäten Ihrer Anwendung zu löschen, wenn Sie die Abmeldeschaltfläche verwenden.

Starten Sie eine Aktivität jedes Mal folgendermaßen:

Intent myIntent = new Intent(getBaseContext(), YourNewActivity.class);
startActivityForResult(myIntent, 0);

Wenn Sie die gesamte App schließen möchten, gehen Sie folgendermaßen vor:

setResult(RESULT_CLOSE_ALL);
finish();

RESULT_CLOSE_ALL ist eine letzte globale Variable mit einer eindeutigen Ganzzahl, die signalisiert, dass Sie alle Aktivitäten schließen möchten.

Definieren Sie dann den onActivityResult(...) -Rückruf jeder Aktivität, sodass beim Zurückgeben einer Aktivität mit dem Wert RESULT_CLOSE_ALL auch finish() aufgerufen wird:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch(resultCode)
    {
    case RESULT_CLOSE_ALL:
        setResult(RESULT_CLOSE_ALL);
        finish();
    }
    super.onActivityResult(requestCode, resultCode, data);
}

Dies führt zu einem Kaskadeneffekt, der alle Ihre Aktivitäten schließt.

Dies ist jedoch ein Hack und verwendet startActivityForResult so, dass es nicht für die Verwendung vorgesehen ist.

Eine bessere Möglichkeit wäre die Verwendung der hier gezeigten Rundfunkempfänger:

Deaktivieren Sie beim Abmelden den Aktivitätsverlaufsstapel, um zu verhindern, dass die Schaltfläche "Zurück" nur angemeldete Aktivitäten öffnet.

Sehen Sie sich diese Threads auch für andere Methoden an:

Android: Löschen Sie den hinteren Stapel

Beende alle vorherigen Aktivitäten

31
Anup Cowkur

Um den Aktivitätsstapel vollständig zu löschen, möchten Sie mit TaskStackBuilder einen neuen Taskstapel erstellen. Beispiel:

Intent loginIntent = LoginActivity.getIntent(context);
TaskStackBuilder.create(context).addNextIntentWithParentStack(loginIntent).startActivities();

Dies erstellt nicht nur einen neuen, sauberen Aufgabenstapel, sondern ermöglicht auch die ordnungsgemäße Funktion der Schaltfläche "Nach oben", wenn Ihre LoginActivity eine übergeordnete Aktivität aufweist.

17
Matt Accola

finishAffinity() in API 16 hinzugefügt. Verwenden Sie ActivityCompat.finishAffinity() in früheren Versionen. Wenn Sie eine Aktivität mit Absicht starten und die aktuelle Aktivität beenden möchten. Verwenden Sie nun ActivityCompat.finishAffinity() anstelle von finish(). Alle gestapelten Aktivitäten unterhalb der aktuellen Aktivität werden beendet. Es funktioniert gut für mich.

14

Was hat bei mir funktioniert?

Intent intent = new Intent(getApplicationContext(), HomeActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);
10
Mongi Zaidi

Für API 11+ können Sie Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK so was:

Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
this.startActivity(intent);

Es werden alle vorherigen Aktivitäten vollständig gelöscht und neue Aktivitäten gestartet.

5
madx

Eine mögliche Lösung, die ich vorschlagen kann, ist das Hinzufügen von Android:launchMode="singleTop" im Manifest für meine ProfileActivity. und wenn Sie auf Abmelden klicken, können Sie Abmelden erneut starten LoginActivity. beim Abmelden und können nenn das.

Intent in = new Intent(Profile.this,Login.class);
                in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(in);
                finish();
4
Android

Sie können finishAffinity() ausprobieren, es schließt alle aktuellen Aktivitäten und funktioniert ab Android 4.1

4
Bunny

Ich stehe auch vor dem gleichen Problem ..

in der Login-Aktivität, was ich tue, ist.

    Intent myIntent = new Intent(MainActivity.this, ActivityLoggedIn.class);
    finish();
    MainActivity.this.startActivity(myIntent);  

bei Abmeldung

   Intent myIntent = new Intent(ActivityLoggedIn.this, MainActivity.class);
   finish();
   ActivityLoggedIn.this.startActivity(myIntent);

Das funktioniert gut, aber wenn ich mich in ActivityLoggedIn befinde und die App minimiere und auf das Symbol der Startschaltfläche in der App-Schublade klicke, startet die MainActivity erneut: -/Ich benutze das Flag

Android:LaunchMode:singleTask 

für die Hauptaktivität.

2
Sujal Mandal

Verwenden Sie Folgendes für activity

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);

remove CLEAR_TASK Flag zur Fragmentverwendung.

Ich hoffe, dass dies für einige Leute verwendet werden kann.

2
Aristo Michael

Versuchen Sie dies, es wird funktionieren:

Intent logout_intent = new Intent(DashboardActivity.this, LoginActivity.class);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(logout_intent);
finish();
1
Mohammad

Behalte es einfach

Intent intent = new Intent(ProfileActivity.this,
    LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(intent);
1
Gaurav Vashisth

Verwenden Sie in API-Level 11 oder höher FLAG_ACTIVITY_CLEAR_TASK und FLAG_ACTIVITY_NEW_TASK Markierung auf Absicht, um den gesamten Aktivitätsstapel zu löschen.

Intent i = new Intent(OldActivity.this, NewActivity.class);
// set the new task and clear flags
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |  Intent.FLAG_ACTIVITY_CLEAR_TASK)
startActivity(i);
1
S.Sathya Priya

Keines der Intent-Flags hat bei mir funktioniert, aber so habe ich es behoben:

Wenn sich ein Benutzer von einer Aktivität abmeldet, musste ich eine Nachricht von dieser Aktivität senden und sie dann in den Aktivitäten empfangen, die ich schließen wollte. Danach rufe ich finish () auf. und es funktioniert ziemlich gut.

1
Ian Wambai

Benutze dies

Intent i1=new Intent(getApplicationContext(),StartUp_Page.class);
i1.setAction(Intent.ACTION_MAIN);
i1.addCategory(Intent.CATEGORY_HOME);
i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
i1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i1);
finish();
0
Prashant Kumar