Frage

ich in der Android-Dokumentation zu lesen, dass durch meine Tätigkeit der launchMode Eigenschaft auf singleTop Einstellung oder durch die FLAG_ACTIVITY_SINGLE_TOP Flagge auf meine Absicht fügen hinzu, dass startActivity(intent) Aufruf eine einzige Aktivität Instanz wieder verwenden würde und geben Sie mir die Absicht in dem onNewIntent Rückruf. Ich habe diese beiden Dinge, und onNewIntent nie ausgelöst und jedes Mal onCreate Feuer. Die docs sagen auch, dass this.getIntent() die Absicht zurück, die zuerst auf die Aktivität übergeben wurde, als es zuerst erstellt wurde. In onCreate bin ich Aufruf getIntent und ich bin ein neuen jedes Mal bekommen (ich die Absicht Objekt in einer anderen Aktivität zu schaffen und das Hinzufügen einer extra es ... diese zusätzlichen soll jedes Mal das gleiche sein, wenn sie mich zurückkehrt das gleiche Absicht Objekt). All dies führt mich zu glauben, dass meine Tätigkeit handelt nicht wie ein „single top“, und ich verstehe nicht, warum.

Um einige Hintergrundinformationen für den Fall hinzufügen, ich bin einfach ein notwendiger Schritt fehlt, ist hier meine Tätigkeit Erklärung im Manifest und der Code, den ich mit der Aktivität zu starten. Die Aktivität selbst tut nichts wert in Bezug auf diese zu erwähnen:

in AndroidManifest.xml:

    <activity
        android:name=".ArtistActivity"
        android:label="Artist"
        android:launchMode="singleTop">
    </activity>     

in meiner Berufung Aktivität:

        Intent i = new Intent();
        i.putExtra(EXTRA_KEY_ARTIST, id);
        i.setClass(this, ArtistActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        startActivity(i);
War es hilfreich?

Lösung

Haben Sie überprüfen, ob onDestroy() auch genannt wurde? Das ist wahrscheinlich, warum onCreate() jedes Mal statt onNewIntent() aufgerufen wird, die nur aufgerufen werden würde, wenn die Aktivität bereits vorhanden ist.

Zum Beispiel, wenn Sie Ihre Aktivität über die BACK-Taste verlassen sie standardmäßig zerstört wird. Aber wenn Sie steigen höher auf die Aktivität Stapel in andere Aktivitäten und von dort aus rufen Sie Ihren ArtistActivity.class wieder wird es onCreate() überspringen und direkt zum onNewIntent() gehen, weil die Aktivität bereits erstellt wurde und da man es als singleTop definiert Android wird kein erstellen neue Instanz davon, aber die man nehmen, die bereits um liegen.

Was ich tun, um zu sehen, was ich geht Dummy-Funktionen für die verschiedenen Zustände der einzelnen Maßnahmen umzusetzen, damit immer ich jetzt, was los ist:

@Override
public void onDestroy() {
    Log.i(TAG, "onDestroy()");
    super.onDestroy();
}

Das Gleiche gilt für onRestart(), onStart(), onResume(), onPause(), onDestroy()

Wenn die oben (BACK-Taste) war nicht Ihr Problem, diese Attrappen Umsetzung wird zumindest helfen Sie es ein bisschen besser debuggen.

Andere Tipps

Die akzeptierte Antwort ist nicht ganz richtig. Wenn onDestroy (), die zuvor genannt wurde, dann ja, onCreate () würde immer genannt werden. Allerdings Diese Aussage ist falsch : „Wenn Sie mehr über die Tätigkeit Stapel in andere Aktivitäten gehen und von dort aus rufen Sie Ihren ArtistActivity.class wieder wird es überspringen onCreate () und gehen direkt an onNewIntent ()“

Der "singleTop" Abschnitt http://developer.android.com/guide /components/tasks-and-back-stack.html erklärt deutlich, wie es funktioniert (Aufmerksamkeit zu fett Text, ich habe dies auch durch meine eigenen Debug-bewiesen):

"beispielsweise an, dass eine Rück Stapel besteht aus Wurzelaktivität A Aufgabe mit Aktivitäten B, C und D auf der Oberseite ( der Stapel ABCD; D oben ist ) eine Absicht kommt für. eine Aktivität des Typs D. wenn D den Standard „Standard“ Startmodus, eine neue Instanz der Klasse hat, wird ins Leben gerufen, und der Stapel wird ABCDD. wenn jedoch D's Startmodus ist „singleTop“ erhält die vorhandene Instanz von D die Absicht durch onNewIntent (), weil es an der Spitze des Stack-der Stapel bleibt ABCD. Allerdings , wenn eine Absichtserklärung für eine Aktivität des Typs B ankommt, dann wird eine neue Instanz von B zu dem Stapel hinzugefügt, auch wenn seine Startmodus ist "singleTop". "

Mit anderen Worten, wird eine Aktivität durch SINGLE_TOP Start Wiederverwendung nur die vorhandene Aktivität, wenn es bereits an der Spitze des Stapels . Es wird nicht funktionieren, wenn eine andere Aktivität in der gleichen Aufgabe an der Spitze (zum Beispiel die Aktivität, die startActivity (SINGLE_TOP) ausgeführt wird) ist; eine neue Instanz statt erstellt werden.

Es gibt zwei Möglichkeiten, um dieses Problem beheben , damit Sie die SINGLE_TOP Verhalten, die Sie wollen - der allgemeine Zweck es ist, eine bestehende Aktivität wieder zu verwenden, anstatt einen neuen zu erstellen ...

Erste Möglichkeit: (wie im Kommentarbereich der akzeptierten beschrieben    Antwort): Sie könnten eine launchMode von „singleTask“, um Ihre Aktivität hinzufügen. Dies würde zwingen onNewIntent (), weil singleTask bedeutet, dass es nur eine Instanz einer bestimmten Aktivität in einer bestimmten Aufgabe sein kann. Dies ist eine etwas hacky Lösung aber, weil wenn Ihre Anwendung mehr Instanzen dieser Aktivität in einer bestimmten Situation braucht (wie ich für mein Projekt zu tun), sind Sie geschraubt.

Zweiter Weg (besser): Statt FLAG_ACTIVITY_SINGLE_TOP verwenden FLAG_ACTIVITY_REORDER_TO_FRONT. Dadurch wird die bestehende Aktivitätsinstanz wiederverwenden, indem es an die Spitze des Stapels zu bewegen (onNewIntent () wird wie erwartet bezeichnet werden).

Der Hauptzweck der FLAG_ACTIVITY_SINGLE_TOP ist die Erstellung mehrerer Instanzen einer Aktivität zu verhindern. Wenn zum Beispiel der Aktivität kann über eine Absicht ins Leben gerufen wird, die von außerhalb der Anwendung Hauptaufgabe kommt. Für die interne Umschaltung zwischen Aktivitäten in meiner app, habe ich festgestellt, dass FLAG_ACTIVITY_REORDER_TO_FRONT ist in der Regel, was ich stattdessen will.

Setzen Sie dieses Kennzeichen, um Ihre Absicht:

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top