Deaktivieren Sie die gesamte Geschichte Stapel und starten Sie eine neue Aktivität auf Android

StackOverflow https://stackoverflow.com/questions/3473168

Frage

Ist es möglich, eine Aktivität auf dem Stapel zu starten, bevor es die gesamte Geschichte Clearing?

Die Situation

I eine Aktivität Stapel dass entweder geht A-> B-> C oder B-> C (Bildschirm A wählt die Benutzer-Token, aber viele Benutzer nur ein einziges Token).

Im Bildschirm C dem Benutzer kann eine Aktion, den Bildschirm B ungültig macht, so dass die Anwendung will sie Bildschirm A zu übernehmen, und zwar unabhängig davon, ob es bereits in dem Stapel. Bildschirm A sollte dann den einzigen Punkt auf dem Stapel in meiner Anwendung.

Notizen

Es gibt viele andere ähnlichen Fragen, aber ich habe nichts gefunden, das genau diese Frage beantwortet. Ich habe versucht Aufruf getParent().finish() - dies führt immer in einer Null-Zeiger-Ausnahme. FLAG_ACTIVITY_CLEAR_TOP funktioniert nur, wenn die Aktivität bereits auf dem Stapel befindet.

War es hilfreich?

Lösung

In API-Ebene 11 eine neue Intent Flagge wurde nur für diesen hinzugefügt: Intent.FLAG_ACTIVITY_CLEAR_TASK

Nur um zu klären, verwenden Sie diese:

Java

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);


Kotlin

intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK


Leider für API lvl <= 10, ich habe noch nicht gefunden eine saubere Lösung für dieses Problem. Die "DontHackAndroidLikeThis" Lösung ist in der Tat rein hackery. Das solltest du nicht tun. :)

Edit: Wie pro @ Ben Pearson 's Kommentar, für API <= 10 kann man nun verwenden IntentCompat Klasse für das gleiche. Man kann IntentCompat.FLAG_ACTIVITY_CLEAR_TASK Flag klare Aufgabe verwenden. So können Sie pre API-Ebene 11 als auch unterstützen kann.

Andere Tipps

Fall 1: Nur zwei Aktivität A und B:

Hier Aktivitätsfluss A-> B .Auf Klicken backbutton von B müssen wir die Anwendung dann schließen, während Aktivität beginnend B von A gerade anruf () diese Android von Speichern Aktivität A verhindern wird in den Backstack.eg für Aktivität A ist Loding / Splash Screen der Anwendung.

Intent newIntent = new Intent(A.this, B.class);
startActivity(newIntent);
finish();

Fall 2: Mehr als zwei activitiy:

Wenn es eine Strömung wie A-> B-> C-> D-> B und Zurück-Taste in Aktion B auf klicken, während sie von Aktivität D.In kommt diesen Fall sollten wir verwenden.

Intent newIntent = new Intent(D.this,B.class);
newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(newIntent);

wird hier Aktivität B aus dem Backstack gestartet werden, anstatt eine neue Instanz wegen Intent.FLAG_ACTIVITY_CLEAR_TOP und Intent.FLAG_ACTIVITY_NEW_TASK löscht den Stapel und macht es die oben one.So wenn wir drücken Zurück-Taste die gesamte Anwendung beendet werden.

Mit Android Neuere Version> = API 16 Verwendung finishAffinity()

Ansatz ist geeignet für> = API 16.

Intent mIntent = new Intent(mContext,MainActivity.class);
finishAffinity();
startActivity(mIntent);
  • Es ist die gleiche wie neue Aktion gestartet, und alle Stapel löschen.
  • oder neu starten zu MainActivity / FirstActivity.

Ich verbrachte ein paar Stunden auf das zu ... und stimmen zu, dass FLAG_ACTIVITY_CLEAR_TOP Geräusche wie das, was man sich wünschen kann: löschen Sie den gesamten Stapel, mit Ausnahme der Aktivität gestartet werden, so dass die Zurück-Taste der Anwendung beendet. Doch wie Mike Repass erwähnt, FLAG_ACTIVITY_CLEAR_TOP funktioniert nur, wenn die Aktivität Sie sind Start bereits in dem Stapel ist; wenn die Tätigkeit nicht da ist, wird die Flagge nichts tun.

Was ist zu tun? Legen Sie die Aktivität Sein Start in dem Stapel mit FLAG_ACTIVITY_NEW_TASK, die diese Tätigkeit den Beginn einer neuen Aufgabe über die Geschichte Stapel macht. Dann fügen Sie die FLAG_ACTIVITY_CLEAR_TOP Flagge.

Nun, wenn FLAG_ACTIVITY_CLEAR_TOP die neue Aktivität im Stapel finden geht, wird es da sein, und bevor alles gezogen wird sonst gelöscht wird.

Hier ist meine Logout-Funktion; die Ansicht Parameter ist die Taste auf die beigefügten ist, welche Funktion.

public void onLogoutClick(final View view) {
    Intent i = new Intent(this, Splash.class);
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    startActivity(i);
    finish();
}

Sie sollten nicht den Stapel ändern. Android Zurück-Taste sollte wie in einem Web-Browser arbeiten.

Ich kann einen Weg finden, es zu tun, aber es ist durchaus ein Hack.

  • Machen Sie Ihre Aktivitäten singleTask indem sie sie an die AndroidManifest Hinzufügen Beispiel:

    <activity android:name=".activities.A"
              android:label="@string/A_title"
              android:launchMode="singleTask"/>
    
    <activity android:name=".activities.B"
              android:label="@string/B_title"
              android:launchMode="singleTask"/>
    
  • Erweitern Application, die die Logik halten wird, wohin sie gehen.

Beispiel:

public class DontHackAndroidLikeThis extends Application {

  private Stack<Activity> classes = new Stack<Activity>();

  public Activity getBackActivity() {
    return classes.pop();
  }

  public void addBackActivity(Activity activity) {
    classes.push(activity);
  }
}

Von A nach B:

DontHackAndroidLikeThis app = (DontHackAndroidLikeThis) getApplication();
app.addBackActivity(A.class); 
startActivity(this, B.class);

Von B nach C:

DontHackAndroidLikeThis app = (DontHackAndroidLikeThis) getApplication();
app.addBackActivity(B.class); 
startActivity(this, C.class);

C:

If ( shouldNotGoBackToB() ) {
  DontHackAndroidLikeThis app = (DontHackAndroidLikeThis) getApplication();
  app.pop();
}

und behandeln die Zurück-Taste, um pop() vom Stapel.

Wieder einmal sollten Sie nicht dies tun:)

Unmittelbar nachdem Sie eine neue Tätigkeit beginnen, mit startActivity, stellen Sie sicher, rufen Sie finish() so dass die aktuelle Aktivität nicht hinter dem neuen gestapelt wird.

Versuchen Sie diese:

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();
Intent i = new Intent(MainPoliticalLogin.this, MainActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);

Versuchen Sie unter Code,

Intent intent = new Intent(ManageProfileActivity.this, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|
                Intent.FLAG_ACTIVITY_CLEAR_TASK| 
                Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

Für mich kein die oben genannten Methoden nicht.

Genau das tut dies auf Löschen aller vorherige Aktivität :

finishAffinity() // if you are in fragment use activity.finishAffinity()
Intent intent = new Intent(this, DestActivity.class); // with all flags you want
startActivity(intent)

fand ich zu einfach Hack nur dieses Add neues Element tun in AndroidManifest als: -

<activity android:name=".activityName"
          android:label="@string/app_name"
          android:noHistory="true"/>

die android:noHistory löschen Ihre unerwünschte Aktivität von Stapeln.

Manchmal Ihre Android-Emulator Macht kann keine Verbindung Eclipse DDMS Werkzeug und fragen Sie nach adb manuell zu starten. In diesem Fall können Sie die adb über die Eingabeaufforderung starten oder stoppen.

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