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
Die vorgeschlagene Lösung hier hat bei mir funktioniert:
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);
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.
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:
Sehen Sie sich diese Threads auch für andere Methoden an:
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.
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.
Was hat bei mir funktioniert?
Intent intent = new Intent(getApplicationContext(), HomeActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);
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.
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();
Sie können finishAffinity()
ausprobieren, es schließt alle aktuellen Aktivitäten und funktioniert ab Android 4.1
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.
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.
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();
Behalte es einfach
Intent intent = new Intent(ProfileActivity.this,
LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
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);
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.
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();