android - deutsch - Eine Aktivität aus dem Verlaufsstapel entfernen




android service lifecycle (9)

Dies ist wahrscheinlich nicht der ideale Weg, dies zu tun. Wenn jemand einen besseren Weg hat, werde ich mich darauf freuen, es umzusetzen. Hier ist, wie ich diese spezielle Aufgabe mit Pre-Version-11 SDK erreicht.

in jeder Klasse, die du weggehen willst, wenn es Zeit ist, musst du das tun:

    ... interesting code stuff ...
    Intent i = new Intent(MyActivityThatNeedsToGo.this, NextActivity.class);
    startActivityForResult(i, 0);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == R.string.unwind_stack_result_id) {
        this.setResult(R.string.unwind_stack_result_id);
        this.finish();
    }
}

dann muss derjenige, der die Pop-Kette aus dem Stack absetzen muss, dies nur aufrufen, wenn Sie es initiieren wollen:

NextActivity.this.setResult(R.string.unwind_stack_result_id);
NextActivity.this.finish();

Dann sind die Aktivitäten nicht auf dem Stapel!
Denken Sie daran, Leute, dass Sie eine Aktivität starten können, und dann beginnen, dahinter zu reinigen, die Ausführung folgt nicht einem einzigen (der ui) -Thread.

Meine App zeigt eine Registrierungsaktivität an, wenn der Nutzer die App zum ersten Mal startet.

  1. ActivitySplashScreen (Willkommen im Spiel, für ein Konto anmelden?)
  2. ActivitySplashScreenSignUp (gut, füllen Sie diese Info aus)
  3. ActivityGameMain (Hauptspielbildschirm)

Die Aktivitäten starten sich also genau in dieser Reihenfolge, wenn der Benutzer auf jedem Bildschirm eine Schaltfläche anklickt.

Wenn der Benutzer von Aktivität 2 nach 3 wechselt, ist es möglich, 1 und 2 vollständig vom Verlaufsstapel zu entfernen? Ich würde es mögen, wenn der Benutzer auf # 3 ist und die Zurück-Taste drückt, gehen sie nur zum Homescreen, anstatt zurück zum Begrüßungsbildschirm.

Ich denke, ich kann das mit Aufgaben erledigen (zB eine neue Aufgabe auf # 3 starten), wollte aber sehen, ob es eine einfachere Methode gibt,

Vielen Dank


Eine Möglichkeit, die vor der API 11 funktioniert, besteht darin, zunächst ActivityGameMain zu starten und dann in der onCreate dieser Aktivität die ActivitySplashScreen Aktivität zu starten. Der ActivityGameMain wird nicht angezeigt, wenn Sie startActivity zu früh für den Splash aufrufen.

Dann können Sie den Stapel löschen, wenn Sie ActivityGameMain starten, indem Sie diese Flags auf den Intent setzen:

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

Sie müssen dies auch zu ActivitySplashScreen hinzufügen:

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

Das Zurückdrücken dieser Aktivität kehrt also nicht zu ActivityGameMain .

Ich nehme an, dass Sie nicht möchten, dass der noHistory zu einem der beiden zurückkehrt. Um dies zu erreichen, noHistory ich, ihn in Ihrer AndroidManifest.xml auf noHistory zu AndroidManifest.xml . goBackPressed Sie den goBackPressed Code stattdessen in Ihre ActivitySplashScreenSignUp Klasse ein.

Ich habe jedoch einige Wege gefunden, dies zu ändern. Starten Sie eine andere App aus einer Benachrichtigung, während ActivitySplashScreenSignUp angezeigt wird und der Hintergrundverlauf nicht zurückgesetzt wird.

Der einzige wirkliche Weg ist API 11:

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

Ich benutze diesen Weg.

Intent i = new Intent(MyOldActivity.this, MyNewActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)
startActivity(i);

Ich weiß, dass ich zu spät dran bin (es ist zwei Jahre her, seit die Frage gestellt wurde), aber ich habe dies erreicht, indem ich den Zurück-Knopfdruck abgefangen habe. Anstatt nach bestimmten Aktivitäten zu suchen, schaue ich einfach auf die Anzahl und wenn es weniger als 3 ist, sendet es einfach die App nach hinten (die App pausiert und den Benutzer zu dem zurückbringt, was vor dem Start ausgeführt wurde). Ich suche nach weniger als drei, weil ich nur einen Intro-Bildschirm habe. Außerdem überprüfe ich die Anzahl, da meine App es dem Benutzer ermöglicht, über das Menü zurück zum Startbildschirm zu navigieren. Dies ermöglicht es ihnen, auf anderen Bildschirmen als normal zu sichern, wenn es andere Aktivitäten als den Intro-Bildschirm auf dem Stapel gibt.

//We want the home screen to behave like the bottom of the activity stack so we do not return to the initial screen
//unless the application has been killed. Users can toggle the session mode with a menu item at all other times.
@Override
public void onBackPressed() {
    //Check the activity stack and see if it's more than two deep (initial screen and home screen)
    //If it's more than two deep, then let the app proccess the press
    ActivityManager am = (ActivityManager)this.getSystemService(Activity.ACTIVITY_SERVICE);
    List<RunningTaskInfo> tasks = am.getRunningTasks(3); //3 because we have to give it something. This is an arbitrary number
    int activityCount = tasks.get(0).numActivities;

    if (activityCount < 3)
    {
        moveTaskToBack(true);
    }
    else
    {
        super.onBackPressed();
    }
}


Rufen Sie einfach this.finish () auf, bevor startActivity (intent) wie folgt-

       Intent intent = new Intent(ActivityOne.this, ActivityTwo.class);
        this.finish();
        startActivity(intent);

Sie können die Weiterleitung verwenden, um die vorherige Aktivität aus dem Aktivitätsstapel zu entfernen, während Sie die nächste starten. Es gibt ein Beispiel dafür in den APIDemos , aber im Prinzip rufen startActivity() nach dem Aufruf von startActivity() .


Versuche dies:

intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)

es ist API Level 1, überprüfen Sie den link .


Sie können dies erreichen, indem Sie das Attribut android:noHistory in den relevanten <activity> AndroidManifest.xml in Ihrer AndroidManifest.xml Datei auf "true" AndroidManifest.xml . Beispielsweise:

<activity
    android:name=".AnyActivity"
    android:noHistory="true" />






activity-lifecycle