Android entfernt Aktivität vom Backstack

73

Okay, ich bin irgendwie ratlos, was ich damit anfangen soll. Ich habe also die Hauptaktivität, und von dort kann eine Aktivität zu DegreePlanActivity gestartet werden, und von dort kann eine andere Aktivität zu EditDegreePlan gestartet werden. Ich habe EditDegreePlan im AndroidManifest auf noHistory gesetzt. Das Problem ist, dass nach dem Speichern des EditDegreePlan eine Aktivität für DegreePlan gestartet wird. Wenn der Benutzer also Zurück drückt, muss er zweimal drücken, um wieder zu MainActivity zu gelangen. Ich möchte das loswerden, damit sie es nur einmal drücken müssen. Ich bin jedoch ratlos, wie das geht.

Wenn ich DegreePlanActivity auf noHistory setze, können sie in EditDegreePlan nicht auf Zurück drücken.

Ich habe versucht, die onBackPressed-Methode zu überschreiben und eine Absicht für MainActivity zu starten. Das Problem ist dann, dass sie mehrmals Zurück drücken müssen, um die App dann zu beenden.

Was soll ich machen?

Emrys90
quelle
14
Schreiben Sie finish () nach startActivity-Methode
Md Abdul Gafur

Antworten:

143

FLAG_ACTIVITY_CLEAR_TOP löscht Ihren Aktivitätsstapel. Sie können den folgenden Code verwenden:

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

Denken Sie daran, dass dieses Flag nur Zwischenaktivitäten löscht, wenn Sie beispielsweise A, B, C in Ihrem Back StackWechsel von C-Aktivität zu D mit diesem Flag haben, wird dies nicht gelöscht Back Stackund der Stapel wäre A, B, C, D, aber wenn Sie Wechseln Sie mit diesem Flag von Aktivität D zu Aktivität A. B, C, D Aktivitäten werden vom Stapel angezeigt und Sie haben nur A im hinteren Stapel.

Arash GM
quelle
Vielen Dank! Das hat perfekt funktioniert. Ich konnte sogar die noHistory aus AndroidManifest entfernen. Das Hinzufügen dieser einen Codezeile zur Speichermethode von EditDegreePlanActivity hat alles behoben.
Emrys90
1
Wie wäre es mit diesen Aktivitäten mit taskAffinity = ""; ?
Ralphgabb
Wow, das ist eine großartige Funktion. Ich kann nicht glauben, dass es funktioniert und genau meinen Bedürfnissen entspricht. Ich habe einen asynchronen Hintergrunddienst, der Barcodes scannt. Und auf bestimmten Barcodes werden einige Aktivitäten gestartet. In einigen Fällen muss ich einige gestartete Aktivitäten vom Stapel entfernen. Das funktioniert einfach super!
Marek
Schöne Erklärung!
iamkdblue
14

einfache Lösung für API> = 15 bis API 23 Benutzeraktivitätsname in Absicht.

 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);
Kamal Bunkar
quelle
1
Genial! Danke für etwas Aktuelles.
3
Vielen Dank, aber IntentCompat.FLAG_ACTIVITY_CLEAR_TASK ist veraltet. Verwenden Sie stattdessen
Intent.FLAG_ACTIVITY_CLEAR_TASK
13

Ich würde vorschlagen, dass Sie startActivityForResult()statt einfach verwenden startActivity(), wenn Sie die EditDegreePlan-Aktivität starten, wie in den Android-Tutorials beschrieben .

In der EditDegreePlan-Aktivität rufen Sie dann auf

setResult(RESULT_OK);
finish();

Wenn Sie keine Daten von der EditDegreePlan-Aktivität erwarten, müssen Sie die nicht unbedingt implementieren onActivityResult.

Soana
quelle
1
Unglaubliche Idee! Mein Anwendungsfall: Eine einfache Anmeldeaktivität (die zu einer Registrierungsaktivität führen kann, die nahtlos in den Benutzerfluss integriert ist). Wenn Sie sich angemeldet haben, öffnen Sie eine Feature-Aktivität. Wenn der Benutzer zurückschlägt, sollte meine erste Aktivität angezeigt werden (die, die die Anmeldung ausgelöst hat). Lösung: Anmelde- und Registrierungsaktivitäten werden jetzt mit aufgerufen startActivityForResult. Wenn sie fertig sind, sind sie aus dem Stapel. Vielen Dank!
Danguilherme
7

Es scheint, dass Sie das gewünschte Verhalten erhalten, wenn Sie überhaupt keine Flags angeben. Der Zurück-Knopf würde genau das Richtige tun. Um eine Aktivität aus Ihrem Code heraus zu schließen, verwenden Sie die finish()Methode, die den gleichen Effekt hat wie der Benutzer, der die Zurück-Taste drückt. Sie gelangen also automatisch zu DegreePlan, wenn Sie den EditDegreePlan beenden. Sie müssen auch keinen aufrufen Intents.

Henry
quelle
7

Um Aktivitäten aus dem Backstack im Manifest zu entfernen, fügen Sie android:noHistory="true"sie Ihrer Aktivität in der Manifestdatei hinzu.

Siehe Beispiel unten.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.example.activity"
      android:versionCode="1"
      android:versionName="1.0">
 <application android:name="MyApp" android:label="My Application">
    <activity android:name=".LoginActivity" 
      android:noHistory="true"> //add this line to your activity inside manifest
     <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
      </intent-filter>
   </activity>
 </application>
</manifest>
Isaac Sekamatte
quelle
Besonders nützlich für einen
Begrüßungsbildschirm
6

Sie können finish aufrufen, bevor Sie mit Ihrer neuen Aktivität beginnen. Dadurch wird die aktuelle Aktivität aus dem Stapel entfernt. Wenn Sie also die Zurück-Taste der nächsten Aktivität drücken, wird die erste Aktivität nicht aus dem Stapelverlauf aufgerufen.

Intent i = new Intent(MainActivity.this, NextActivity.class);
finish();  
startActivity(i);
Live-Liebe
quelle
1
Egal, ob Sie es vor oder nach startActivity () aufrufen, es wird keine erste Aktivität geben
Makarand
5

Hier ist dein Fluss:

MainActivity -> DegreePlanActivty -> EditDegreePlan -> DegreePlan -> MainActivty

Überschreiben Sie diese Methode in Ihrem "DegreePlan"

public void onBackPressed() {
   super.onBackPressed();
   Intent goToMainActivity = new Intent(getApplicationContext(), MainActivity.class);
   goToMainActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // Will clear out your activity history stack till now
   startActivity(goToMainActivity);
}
Vikalp Patel
quelle
2

Verwenden Sie dies, um den Stapel zu löschen:

 menuIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_TOP);
Heena Arora
quelle
1
Intent intent = new Intent(getContext(), MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 

startActivity(intent);
Luis Muñoz
quelle
0

Sie können Flags wie folgt hinzufügen und Aktivität starten. Versuchen Sie es mit dem folgenden Code

Intent i = new Intent(activity, Payment.class);
i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_TOP);
activity.startActivity(i);
Rachit Mishra
quelle
0
This code should help you out: It is in Kotlin
private fun verifyIfUserIsLoggedIn(){
        val uid = FirebaseAuth.getInstance().uid
        if(uid== null){
            val intent = Intent(this, MainActivity::class.java)
            intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK.or(Intent.FLAG_ACTIVITY_NEW_TASK)
            startActivity(intent)
        }
    }
Emmanuel Ametepee
quelle