Wie behandelt man einen Tag, der bei offener Aktivität ankommt?
Stellen Sie ihn der Instanz zu, die schon auf dem Bildschirm ist. Deklarieren Sie die Aktivität als singleTop, oder fügen Sie der Absicht der Vordergrund-Zustellung FLAG_ACTIVITY_SINGLE_TOP hinzu, und lesen Sie den Tag in onNewIntent. Sonst startet jedes Antippen eine neue Kopie der Aktivität über der letzten.
Was von Haus aus geschieht
Ein Tag wird mit startActivity zugestellt, und der voreingestellte Startmodus beantwortet jeden Start mit einer neuen Instanz. Der Leitfaden zu Aufgaben und Rücksprungstapel zeigt das Ergebnis: aus einem Stapel A, B, C und D wird A, B, C, D und D.
Für einen Bildschirm, der Tags liest, heißt das eine neue Kopie je Antippen. Jede Kopie hat ihren eigenen Zustand und ihren eigenen Tag, und Zurück läuft durch alle, bevor es die Anwendung verlässt.
singleTop und onNewIntent
Mit dem Startmodus singleTop geht eine Absicht für eine Aktivität, die bereits oben auf dem Stapel liegt, an diese Instanz, über onNewIntent(), und es entsteht keine Kopie. FLAG_ACTIVITY_SINGLE_TOP auf der Absicht hat dieselbe Wirkung, weshalb das Beispiel zur Vordergrund-Zustellung im Leitfaden zu fortgeschrittenem NFC es seiner PendingIntent hinzufügt.
Die Zustellung geht durch eine Pause. Die Referenz zu Activity sagt, dass eine Aktivität nie im fortgesetzten Zustand eine neue Absicht bekommt: sie wird angehalten, bekommt die Absicht und wird dann fortgesetzt. Die Vordergrund-Zustellung, in onPause ausgeschaltet und in onResume wieder eingeschaltet, folgt diesem Zyklus bei jedem Antippen.
singleTask leitet die Absicht ebenfalls an die vorhandene Instanz, ändert aber die Aufgabe, in der die Aktivität lebt, und zerstört die Aktivitäten darüber. Für einen Lesebildschirm ist singleTop die kleinere Änderung.
getIntent trägt weiterhin den ersten Tag
Die Referenz zu Activity ist deutlich: nach onNewIntent() gibt getIntent() weiterhin die ursprüngliche Absicht zurück. Code, der den Tag in onResume aus getIntent() liest, verarbeitet bei jedem späteren Antippen erneut den ersten Tag.
Rufen Sie setIntent() mit der neuen Absicht auf, oder lesen Sie den Tag in onNewIntent() und nie aus getIntent().
Ein alter Tag ist schlimmer als ein falscher. Die Referenz zu Tag sagt, dass bei jedem Erkennen ein neues Tag-Objekt entsteht und nur das jüngste eine Technologieklasse öffnen kann, und ein Objekt, das nach dem Verschwinden seines Tags wiederverwendet wird, löst SecurityException aus.
Der Lesemodus umgeht die Frage
Der Lesemodus benutzt keine Absichten. Tags erreichen einen Rückruf in der Aktivität, die ihn eingeschaltet hat, sodass es keinen Startmodus gibt, den man falsch machen kann, und keine zweite Instanz, die entstehen könnte.
Für einen Bildschirm, der viele Tags hintereinander liest, etwa eine Bestandsprüfung, ist er der einfachere Entwurf, verglichen auf der Seite zum Lesemodus.
Häufige Fragen
Warum verarbeitet meine Anwendung nach dem zweiten Antippen wieder den ersten Tag?
getIntent gibt nach onNewIntent weiterhin die ursprüngliche Absicht zurück. Rufen Sie setIntent mit der neuen auf, oder lesen Sie den Tag in onNewIntent.
Sollte die Aktivität stattdessen singleTask benutzen?
Es stellt ebenfalls der vorhandenen Instanz zu, ändert aber die Aufgabe der Aktivität und zerstört die Aktivitäten darüber. singleTop ist die engere Abhilfe für einen Lesebildschirm.
Warum läuft Zurück durch mehrere Kopien meines Bildschirms?
Die Aktivität benutzt den voreingestellten Startmodus, also hat jedes Antippen eine neue Instanz gestartet. singleTop, oder der Schalter auf der Zustellabsicht, beendet das Stapeln.
Ist der Tag noch benutzbar, wenn onNewIntent läuft?
Nur solange er noch im Feld ist. Verlagern Sie jeden Austausch sofort vom Hauptthread weg, da ein spät begonnener Austausch einen Tag trifft, den die Nutzerin oder der Nutzer schon weggenommen hat.