it-swarm.com.de

Beenden Sie alle vorherigen Aktivitäten

Meine Anwendung verfügt über die folgenden Ablaufanzeigen:

Home->screen 1->screen 2->screen 3->screen 4->screen 5

Jetzt habe ich in jedem Bildschirm eine gemeinsame Schaltfläche log out

(Home/ screen 1 / screen 2 /screen 3/ screen 4 / screen 5)

Ich möchte, dass, wenn der Benutzer auf die Schaltfläche zum Abmelden klickt (von einem beliebigen Bildschirm aus), alle Bildschirme beendet werden und ein neuer Bildschirm Log in geöffnet wird.

Ich habe fast alle FLAG_ACTIVITY versucht, um dies zu erreichen. Ich gehe auch einige Antworten im Stackoverflow durch, bin aber nicht in der Lage, das Problem zu lösen. Meine Anwendung ist auf Android 1.6, kann also FLAG_ACTIVITY_CLEAR_TASK nicht verwenden

Gibt es eine Möglichkeit, das Problem zu lösen?

340
Tanmay Mandal

Verwenden:

Intent intent = new Intent(getApplicationContext(), Home.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

Dadurch werden alle Aktivitäten auf der Startseite gelöscht.

Angenommen, Sie beenden den Anmeldebildschirm, wenn sich der Benutzer anmeldet und die Startseite erstellt wurde. Anschließend werden alle Bildschirme von 1 bis 5 darüber angezeigt. Mit dem von mir geposteten Code kehren Sie zum Startbildschirm zurück und beenden alle anderen Aktivitäten. Sie können der Absicht ein zusätzliches Element hinzufügen und dieses in der Aktivität auf dem Startbildschirm lesen und auch beenden (möglicherweise starten Sie den Anmeldebildschirm von dort aus erneut oder so etwas).

Ich bin nicht sicher, aber Sie können auch versuchen, sich mit dieser Flagge anzumelden. Ich weiß nicht, wie die Aktivitäten in diesem Fall angeordnet werden. Also weiß ich nicht, ob die unter dem Bildschirm, auf dem Sie sich gerade befinden, gelöscht werden, einschließlich des Bildschirms, auf dem Sie sich gerade befinden, aber es ist definitiv der richtige Weg.

Hoffe das hilft.

502
DArkO

Sie können Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK versuchen. Es werden alle vorherigen Aktivitäten vollständig gelöscht und neue Aktivitäten gestartet.

294
Kong Ken

Fügen Sie einfach den folgenden Code hinzu, bevor Sie Ihre neue Aktivität starten:

finishAffinity();

Oder wenn Sie möchten, dass es in früheren Versionen von Android funktioniert:

ActivityCompat.finishAffinity(this);
125
Henrique

Wenn der Benutzer alle offenen Aktivitäten beenden möchte, sollte er eine Schaltfläche drücken, die die erste Aktivität lädt, die beim Start Ihrer Anwendung ausgeführt wird, alle anderen Aktivitäten löschen und die letzte verbleibende Aktivität beenden. Lassen Sie den folgenden Code ausführen, wenn der Benutzer die Schaltfläche zum Beenden drückt. In meinem Fall ist LoginActivity die erste Aktivität in meinem Programm, die ausgeführt wird.

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);

Der obige Code löscht alle Aktivitäten mit Ausnahme von LoginActivity. Fügen Sie dann den folgenden Code in die LoginActivity-Anweisung onCreate(...) ein, um zu überwachen, ob LoginActivity neu erstellt wurde und das Signal 'EXIT' übergeben wurde:

if (getIntent().getBooleanExtra("EXIT", false)) {
    finish();  
}

Warum ist es so schwierig, in Android eine Schaltfläche zum Beenden zu erstellen?

Android versucht, Sie davon abzuhalten, eine Schaltfläche zum Beenden in Ihrer Anwendung zu verwenden, da es dem Benutzer egal sein soll, ob die von ihm verwendeten Programme im Hintergrund ausgeführt werden oder nicht.

Die Entwickler des Betriebssystems Android möchten, dass Ihr Programm in der Lage ist, ein unerwartetes Herunterfahren und Ausschalten des Telefons zu überstehen. Wenn der Benutzer das Programm neu startet, setzt er dort an, wo er aufgehört hat. So kann der Benutzer einen Anruf erhalten, während er Ihre Anwendung verwendet, und Karten öffnen, für die Ihre Anwendung für mehr Ressourcen freigegeben werden muss.

Wenn der Benutzer Ihre Anwendung wieder aufnimmt, beginnt er dort, wo er ohne Unterbrechung aufgehört hat. Diese Schaltfläche zum Beenden nimmt dem Aktivitätsmanager Strom ab und verursacht möglicherweise Probleme mit dem automatisch verwalteten Android Programmlebenszyklus.

38
Eric Leschinski
Intent intent = new Intent(this, classObject);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

Dies funktioniert für alle Android Versionen. Dabei ist IntentCompat die Klasse, die in der Android Support-Bibliothek hinzugefügt wurde.

31
Gem

Verwenden Sie für die Aktivität Folgendes

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

entfernen Sie das CLEAR_TASK-Flag für die Fragmentverwendung.

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

30
Aristo Michael

Von developer.Android.com :

public void finishAffinity ()

Hinzugefügt in API Level 16

Beenden Sie diese Aktivität sowie alle Aktivitäten unmittelbar darunter in der aktuellen Aufgabe, die dieselbe Affinität haben. Dies wird normalerweise verwendet, wenn eine Anwendung zu einer anderen Aufgabe gestartet werden kann (z. B. aus einer ACTION_VIEW eines Inhaltstyps, den sie versteht) und der Benutzer die Aufwärtsnavigation verwendet hat, um von der aktuellen Aufgabe zu seiner eigenen Aufgabe zu wechseln. In diesem Fall sollten, wenn der Benutzer zu anderen Aktivitäten der zweiten Anwendung navigiert ist, alle diese im Rahmen des Task-Wechsels aus der ursprünglichen Task entfernt werden.

Beachten Sie, dass Sie mit dieser Ausführung keine Ergebnisse für die vorherige Aktivität liefern können. Wenn Sie dies versuchen, wird eine Ausnahme ausgelöst.

20
gmrl

Ich glaube, ich bin spät dran, aber es gibt eine einfache und kurze Antwort. Es gibt eine finishAffinity () -Methode in Activity, mit der die aktuelle Aktivität und alle übergeordneten Aktivitäten beendet werden. Sie funktioniert jedoch nur in Android 4.1 oder höher.

Verwenden Sie für API 16+

finishAffinity();

Verwenden Sie für unter 16

ActivityCompat.finishAffinity(YourActivity.this);

Ich hoffe es hilft!

18
Akshay Taru

Wenn Ihre Anwendung mindestens SDK-Version 16 hat, können Sie finishAffinity () verwenden.

Beenden Sie diese Aktivität sowie alle Aktivitäten unmittelbar darunter in der aktuellen Aufgabe, die dieselbe Affinität haben.

Dies ist Arbeit für mich. Im Top Payment-Bildschirm alle Backstack-Aktivitäten entfernen.

@Override
public void onBackPressed() {
         finishAffinity();
        startActivity(new Intent(PaymentDoneActivity.this,Home.class));
    } 

http://developer.Android.com/reference/Android/app/Activity.html#finishAffinity%28%29

13
Jaydeep purohit

Gut zu wissen
Diese Antwort funktioniert ( https://stackoverflow.com/a/13468685/7034327 )

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

während dies nicht funktioniert

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

.setFlags() ersetzt alle vorherigen Flags und fügt keine neuen Flags an, während .addFlags() dies tut.

Das wird also auch funktionieren

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
13
John

Verwenden Sie für die Abmeldeschaltfläche im letzten Bildschirm der App diesen Code im Listener der Abmeldeschaltfläche, um alle zuvor geöffneten Aktivitäten abzuschließen, und Ihr Problem ist behoben.

{
Intent intent = new Intent(this, loginScreen.class);
ntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
10
Amrit

Eine Lösung, die ich dafür implementiert habe (ich glaube, ich habe sie irgendwo auf Stack Overflow gefunden, aber ich erinnere mich nicht, also danke, wer das überhaupt getan hat):

Gehen Sie bei jeder Ihrer Aktivitäten folgendermaßen vor:

// Clear your session, remove preferences, etc.
Intent intent  = new Intent(getBaseContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

Überschreiben Sie dann in Ihrer LoginActivity onKeyDown:

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

ich habe das gleiche Problem, das Sie IntentCompat verwenden können, wie folgt:

import Android.support.v4.content.IntentCompat;
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);

dieser Code funktioniert für mich.

Android api 17

8
    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();
8
Prashant Kumar

anstelle von finish() nur finishAffinity(); verwenden

7
Hitesh Kushwah

In meinem Fall verwende ich die Funktion finishAffinity() in der letzten Aktivität wie folgt:

finishAffinity()
startHomeActivity()

Hoffe, es wird nützlich sein.

6
Djek-Grif

für API> = 15 bis API 23 einfache Lösung.

 Intent nextScreen = new Intent(currentActivity.this, MainActivity.class);
 nextScreen.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
 startActivity(nextScreen);
 ActivityCompat.finishAffinity(currentActivity.this);
6
Kamal Bunkar

Anmelden> Start> Bildschirm 1-> Bildschirm 2-> Bildschirm 3-> Bildschirm 4-> Bildschirm 5

auf Bildschirm 4 (oder einem anderen) ->

StartActivity (Anmelden)
FLAG_ACTIVITY_CLEAR_TOP
6
Plamen Nikolov

Wenn Sie startActivityForResult() in Ihren vorherigen Aktivitäten verwenden, überschreiben Sie OnActivityResult() und rufen Sie die darin enthaltene finish(); -Methode in allen Aktivitäten auf. Dies erledigt die Aufgabe ...

5
ngesh

Wenn der Benutzer auf die Schaltfläche zum Abmelden klickt, geben Sie den folgenden Code ein:

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

Und auch wenn Sie nach dem Login eine neue Aktivität aufrufen, verwenden Sie nicht finish ().

3
nikki

Einfach, wenn Sie den Anmeldebildschirm verlassen und nicht, wenn Sie den Anmeldebildschirm beendet haben.

Verwenden Sie dann in allen Vorwärtsaktivitäten diese Option zum Abmelden:

final Intent intent = new Intent(getBaseContext(), LoginScreen.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(intent);

Es funktioniert perfekt.

2
Asad Rao

Ich habe diesen Weg gefunden, es wird die gesamte Geschichte löschen und beenden

Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startMain);
Intent intent = new Intent(getApplicationContext(), SplashScreen.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

finish();
System.exit(0);
1
pirooz jenabi

Wenn Sie den Benutzer in screen 1 anmelden und von dort aus zu den anderen Bildschirmen wechseln, verwenden Sie

Intent intent = new Intent(this, Screen1.class);
intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
1
Gabriel Negut

Ich fand, dass diese Lösung trotz API-Level auf jedem Gerät funktioniert (sogar für <11)

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);
0
priyankvex