Frage

Meine Anwendung verfügt über die folgenden Ablaufbildschirme:

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

Jetzt habe ich in jedem Bildschirm eine gemeinsame Schaltfläche für den 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 generischer Codetagcode für den Bildschirm geöffnet wird.

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

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

War es hilfreich?

Lösung

Verwenden Sie:

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

Dadurch werden alle Aktivitäten über dem Haus gelöscht.

Angenommen, Sie beenden den Anmeldebildschirm, wenn sich der Benutzer anmeldet und die Startseite erstellt wird, und anschließend alle Bildschirme von 1 bis 5 darüber.Der Code, den ich gepostet habe, bringt Sie zum Startbildschirm zurück und beendet alle anderen Aktivitäten.Sie können der Absicht ein zusätzliches hinzufügen und dies in der Startbildschirmaktivität lesen und auch beenden (möglicherweise den Anmeldebildschirm von dort aus erneut starten oder so).

Ich bin mir nicht sicher, aber Sie können auch versuchen, sich mit diesem Flag anzumelden.Ich weiß nicht, wie die Aktivitäten in diesem Fall bestellt werden.Sie wissen also nicht, ob die Bilder unter dem Bildschirm, auf dem Sie sich befinden, einschließlich desjenigen, auf dem Sie sich gerade befinden, gelöscht werden, aber es ist definitiv der richtige Weg.

Hoffe das hilft.

Andere Tipps

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

Fügen Sie vor dem Starten Ihrer neuen Aktivität einfach den folgenden Code hinzu:

finishAffinity();

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

ActivityCompat.finishAffinity(this);

Wenn der Benutzer alle geöffneten 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 Exit-Taste 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);

Mit dem obigen Code werden alle Aktivitäten außer dem LoginActivity gelöscht. Fügen Sie dann den folgenden Code in den LoginActivity des onCreate(...)s ein, um zu prüfen, wann der LoginActivity neu erstellt und das Signal 'EXIT' übergeben wurde:

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

Warum ist es so schwierig, eine Exit-Schaltfläche in Android zu erstellen?

Android ist bemüht, Sie davon abzuhalten, eine Schaltfläche zum Beenden in Ihrer Anwendung zu verwenden, da der Benutzer sich nie darum kümmern soll, ob die von ihm verwendeten Programme im Hintergrund ausgeführt werden oder nicht.

Die Entwickler von Android-Betriebssystemen möchten, dass Ihr Programm ein unerwartetes Herunterfahren und Ausschalten des Telefons übersteht. Wenn der Benutzer das Programm neu startet, wird es genau dort fortgesetzt, wo es 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, wird er ohne Unterbrechung genau dort fortgesetzt, wo er aufgehört hat. Diese Exit-Schaltfläche beansprucht die Stromversorgung des Aktivitätsmanagers und verursacht möglicherweise Probleme mit dem automatisch verwalteten Lebenszyklus des Android-Programms.

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.Wobei IntentCompat die Klasse in der Android Support-Bibliothek hinzugefügt.

Verwenden Sie Folgendes für Aktivitäten

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 nützlich sein kann.

Von developer.android.com :

public void finishAffinity ()

Hinzugefügt in API Level 16

Beenden Sie diese Aktivität sowie alle Aktivitäten direkt darunter in der aktuellen Aufgabe, die dieselbe Affinität haben.Dies wird normalerweise verwendet, wenn eine Anwendung für eine andere Aufgabe gestartet werden kann (z. B. über eine ACTION_VIEW eines Inhaltstyps, den sie versteht) und der Benutzer die Aufwärtsnavigation verwendet hat, um von der aktuellen Aufgabe zu einer eigenen Aufgabe zu wechseln.Wenn der Benutzer in diesem Fall zu anderen Aktivitäten der zweiten Anwendung navigiert ist, sollten alle diese als Teil des Aufgabenwechsels aus der ursprünglichen Aufgabe entfernt werden.

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

Ich glaube, ich bin spät dran, aber es gibt eine einfache und kurze Antwort. In Activity gibt es eine finishAffinity () -Methode, 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);

Hoffe es hilft!

Nebenbei bemerkt, 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 hinzu, während .addFlags() dies tut.

Das funktioniert also auch

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

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

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

Dies ist Arbeit für mich. Entfernen Sie im Bildschirm "Top Payment" alle Back-Stack-Aktivitäten.

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

http://developer.android.com/Referenz / android / app / Activity.html # finishAffinity% 28% 29

Eine Lösung, die ich dafür implementiert habe (ich glaube, ich habe sie irgendwo bei Stack Overflow gefunden, aber ich erinnere mich nicht, also danke an denjenigen, der das zuerst getan hat):

Führen Sie bei einer Ihrer Aktivitäten Folgendes aus:

// 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);
}

Verwenden Sie für die Abmeldeschaltfläche auf dem letzten Bildschirm der App diesen Code im Listener der Abmeldeschaltfläche, um alle geöffneten vorherigen 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);
}

    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();

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

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

Verwenden Sie anstelle von finish() einfach finishAffinity();

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

finishAffinity()
startHomeActivity()

Hoffe, es wird nützlich sein.

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

auf Bildschirm 4 (oder einem anderen) ->

StartActivity(Log in)
mit
FLAG_ACTIVITY_CLEAR_TOP

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);

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

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

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

Und auch wenn Sie nach der Anmeldung eine neue Aktivität aufrufen, verwenden Sie nicht finish ();

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

Verwenden Sie diese Option dann bei allen Weiterleitungsaktivitäten zum Abmelden:

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

Es funktioniert perfekt.

Wenn Sie den Benutzer mit 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);

Ich habe diesen Weg gefunden, er löscht den gesamten Verlauf und beendet

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);

Ich habe festgestellt, dass diese Lösung trotz API-Ebene (auch für <11) auf jedem Gerät funktioniert

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top