it-swarm.com.de

Android: Lösche den hinteren Stapel

In Android habe ich einige Aktivitäten, sagen wir A, B, C.

In A benutze ich diesen Code, um B zu öffnen:

Intent intent = new Intent(this, B.class);
startActivity(intent);

In B verwende ich diesen Code, um C zu öffnen:

Intent intent = new Intent(this, C.class);
startActivity(intent);

Wenn der Benutzer eine Schaltfläche in C antippt, möchte ich zu A zurückkehren und den hinteren Stapel löschen (sowohl B als auch C schließen). Wenn der Benutzer die Zurück-Taste B und C nicht zeigt, habe ich Folgendes versucht:

Intent intent = new Intent(this, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(intent);

B und C werden jedoch immer noch angezeigt, wenn ich die Zurück-Taste benutze, wenn ich wieder in Aktivität A bin. Wie kann ich das vermeiden?

288
Martin

Fügen Sie FLAG_ACTIVITY_NEW_TASK hinzu, wie in den Dokumenten für FLAG_ACTIVITY_CLEAR_TOP beschrieben:

Dieser Startmodus kann auch für .__ verwendet werden. gute Wirkung in Verbindung mit FLAG_ACTIVITY_NEW_TASK: wenn verwendet für Starten Sie die Stammaktivität einer Aufgabe bringt alle aktuell laufenden Instanz dieser Aufgabe auf die Vordergrund, und löschen Sie es dann auf seine Wurzelzustand. Dies ist besonders nützlich, Zum Beispiel beim Starten eines Aktivität aus der Benachrichtigung Manager.

Ihr Code zum Starten von A lautet also:

Intent intent = new Intent(this, A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);
finish(); // call this to finish the current activity
394
Jake Basile
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
134
diesel

Was ist mit dem Hinzufügen von Manifests-Dateien für verwandte Aktivitäten:

Android:noHistory="true"

zur Aktivitätsdefinition von B und C? Sie werden nicht zum Backstack hinzugefügt. Nicht sicher, ob Sie das wollen.

72
cirrus

Das stört mich lange. Zum Schluss habe ich es so herausgearbeitet:

Verwenden Sie in fragment:

Intent intent = new Intent(view.getContext(), A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);

Verwenden Sie in Activity (fügen Sie ein weiteres Intent-Flag Intent.FLAG_ACTIVITY_CLEAR_TASK verglichen mit Fragment hinzu)

Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
53
Geng Jiawen
  1. Fügen Sie dem Aktivitätselement in Ihrem Manifest für Aktivität A Android:launchMode="singleTop" hinzu
  2. Verwenden Sie dann intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) und intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK), wenn Sie Aktivität A starten

Das bedeutet, dass beim Starten von Aktivität A alle darüber liegenden Aufgaben gelöscht werden, sodass A oben ist. Ein neuer Backstack wird mit A im Stammverzeichnis erstellt. Durch Verwendung von singleTop wird sichergestellt, dass Sie A immer nur einmal starten (da A aufgrund von ..._CLEAR_TOP jetzt oben ist).

28
Joseph Earl

Ab API 16 (Jelly Bean) können Sie einfach finishAffinity() aufrufen.

Jetzt können Sie auch ActivityCompat.finishAffinity(Activity activity) mit der Kompatibilitätsbibliothek aufrufen.

Stellen Sie sicher, dass Sie taskAffinity im Manifest auf einen Paketnamen setzen, der für diese Gruppe von Aktivitäten eindeutig ist.

Weitere Informationen finden Sie unter:
http://developer.Android.com/reference/Android/support/v4/app/ActivityCompat.html#finishAffinity%28Android.app.Activity%29

25
Daniel Schuler

Versuchen Sie es mit

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

und nicht

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
14

Wenn Ihre Anwendung über mindestens Sdk-Version 16 verfügt, können Sie .__ verwenden. finishAffinity ()

Beenden Sie diese Aktivität sowie alle unmittelbar darunter liegenden Aktivitäten in der aktuellen Aufgabe, die die gleiche Affinität aufweisen. 

Dies ist eine Arbeit für mich.__Im Bildschirm "Top-Zahlung" werden alle Back-Stack-Aktivitäten entfernt.

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

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

8
Jaydeep purohit

Versuchen Sie diesen Code für zukünftige Untersuchungen.

Intent intent = new Intent(context, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();
7
GeetT

Verwenden Sie finishAffinity (). in Aufgabe C beim Starten von Aufgabe A, um die Backstack-Aktivitäten zu löschen.

6
baswaraj

Per Wakka in Entfernen einer Aktivität aus dem Historienstapel ...


Fügen Sie das Android:noHistory="true"-Attribut wie folgt zu Ihrem <activity> im AndroidManifest.xml hinzu:

    <activity Android:name=".MyActivity"
        Android:noHistory="true">
    </activity>
6

verwenden Sie diesen Code zum Starten einer neuen Aktivität und schließen oder zerstören Sie alle anderen Aktivitätsstacks oder Backstacks ...

Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
4
Pankaj Talaviya

Ich fand die Antworten hier ein wenig irreführend, weil der Code in der ursprünglichen Frage für mich gut zu funktionieren scheint?

Wenn A die Root-Aktivität ist, wird beim Start von B oder C nur mit FLAG_ACTIVITY_CLEAR_TOP B und C aus dem hinteren Stapel entfernt.

3
ianjoyner

In Kotlin ist es fast genauso wie in Java. Nur | Das Symbol wird durch oder text ..__ ersetzt. Es wird also wie folgt geschrieben:

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
3
Exigente05
Use finishAffinity() to clear all backstack with existing one.

Suppose, Activities A, B and C are in stack, and finishAffinity(); is called in Activity C, 

    - Activity B will be finished / removing from stack.
    - Activity A will be finished / removing from stack.
    - Activity C will finished / removing from stack.
3
Firzan Shaikh

Intent.FLAG_ACTIVITY_CLEAR_TOP funktioniert in diesem Fall nicht. Bitte verwenden Sie (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)

Weitere Informationen finden Sie in der this -Dokumentation.

2
Ashish Saini

Ich habe eine interessante Lösung gefunden, die helfen könnte. Ich habe das in meiner onBackPressed() Methode gemacht.

finishAffinity();
finish();

FinishAffinity entfernt die Verbindung der vorhandenen Aktivität zu ihrem Stack. Und das Ende hilft Ihnen dabei, diese Aktivität zu beenden. Dadurch wird die Anwendung schließlich beendet.

2
Sujit Royal

Es klingt für mich, als müssten Sie Activity C von Activity B starten, indem Sie startActivityForResult() verwenden. Wenn Sie auf eine Schaltfläche in Activity C klicken, rufen Sie setResult(RESULT_OK) und finish() auf, damit Activity C beendet wird. In Activity B könnten Sie die onActivityResult() reagieren lassen, indem Sie auch finish() für sich selbst aufrufen, und Sie würden dann zu Activity A zurückkehren.

2
Maximus

logout.addFlags (Intent.FLAG_ACTIVITY_CLEAR_TASK); logout.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK);

1
Abhijeet

Ich habe alle Lösungen ausprobiert und keine hat für mich einzeln gearbeitet .. Meine Lösung ist:

Deklarieren Sie Activity A als SingleTop, indem Sie [Android:launchMode="singleTop"] im Android-Manifest verwenden.

Fügen Sie nun die folgenden Flags hinzu, während Sie A von überall starten. Der Stapel wird gelöscht.

Intent in = new Intent(mContext, A.class);
in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK );
startActivity(in);
finish();
1
Tarun

In diesem Beispiel können Sie Ihren Activity A von Activity C aus aufrufen.

Intent loout = new Intent(context, LoginActivity.class); loout.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); context.startActivity(loout);

1
Vipin Yadav

Zusätzlich zu FLAG_ACTIVITY_CLEAR_TOP können Sie auch Intent.FLAG_ACTIVITY_SINGLE_TOP hinzufügen:

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

0
binnyb

Im manifest

Android:launchMode="singleTask"

und

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
0
blackjack

Fügen Sie in der Absicht NO History Flag hinzu.

Starten Sie in Aktivität B die Aktivität C wie folgt: >>>>>>

Intent intent = new Intent(this, C.class);
intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); 
startActivity(intent);
finish();
0
Arun Sharma
 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
0

So habe ich das Problem gelöst:

private boolean clearHistoryBackStack = true;

@Override
public final void finish() {
    super.finish();

    if(clearHistoryBackStack)
        finishAffinity();
}
0
user2830808

Dieser Code funktioniert für mich in Kotlin:

 val intent = Intent(this, MainActivity::class.Java)
 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
 startActivity(intent)
 finish()
0

Fügen Sie dies entweder Ihrem Activity B und Activity C hinzu.

Android:noHistory="true"

oder OverrideonBackPressed Funktion, um ein Zurückdrücken mit einer return zu vermeiden.

@Override
public void onBackPressed() {
   return;
}
0
Renjith JR

Der angegebene Code funktioniert korrekt. Ich habe es im Anwendungslebenszyklus-Beispiel versucht.

Ich habe B und C nicht mehr im Backstack, nachdem ich Aktivität A mit Flag FLAG_ACTIVITY_CLEAR_TOP gestartet habe

0
Sathesh

Kotlin-Beispiel:

      val intent = Intent([email protected], MainActivity::class.Java)
      intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK
      startActivity(intent)
      finish()
0
stevyhacker

ich rief activity_name.this.finish() an, nachdem ich eine neue Absicht begonnen hatte, und es funktionierte für mich.

I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK"

Aber es funktioniert nicht für mich ... Ich schlage diese Lösung nicht für die Verwendung vor, aber wenn das Setzen von Flag für Sie nicht funktioniert, können Sie dies versuchen

0

Das funktionierte für mich mit onBackPressed:

public void onBackPressed()
{
    Intent intent = new Intent(ImageUploadActivity.this, InputDataActivity.class);

    Intent myIntent = new Intent(this, ImageUploadActivity.class);
    myIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
   finish();
}
0
PhilipS

Verwenden Sie die setFlags () -Methode, um die Rückseite zu löschen, um alle Aktivitäten zu schließen und zu starten yourActvity

Intent intent = new Intent(getApplicationContext(), yourActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
0
Pankaj Talaviya