Lesemodus oder Vordergrund-Zustellung: was sollte eine Android-Anwendung nehmen?
Den Lesemodus, wenn der Bildschirm zum Lesen von Tags da ist. Er reicht jeden Tag direkt an einen Rückruf, kann die NDEF-Prüfung und den Ton des Systems überspringen und hält die Kartenemulation an, solange er läuft. Die Vordergrund-Zustellung passt zu einer Anwendung, die Tags gelegentlich trifft.
Was beide tun
Beide geben der Aktivität auf dem Bildschirm den ersten Zugriff auf den nächsten Tag, vor jeder Anwendung, die sich im Manifest für Tags eingetragen hat. Die Referenz zu NfcAdapter beschreibt die Vordergrund-Zustellung als Vorrang für die Aktivität im Vordergrund und den Lesemodus als Beschränkung des Controllers, solange die Aktivität im Vordergrund ist.
Keiner von beiden überlebt es, wenn die Aktivität den Bildschirm verlässt. Die Vordergrund-Zustellung muss eingeschaltet sein, während die Aktivität fortgesetzt ist, und vor dem Ende ihres onPause wieder ausgeschaltet werden, und ein Aufruf außerhalb des Vordergrunds löst IllegalStateException aus.
Und keiner von beiden ändert etwas, wenn die Anwendung geschlossen ist. Ein Tag, der die Anwendung starten soll, geht über das Manifest, das die Seite zum Manifest behandelt.
Was der Lesemodus ändert
Der Lesemodus macht den Controller zu einem Lesegerät und zu nichts anderem. Die Referenz hält fest, dass er Punkt-zu-Punkt-Modus und Kartenemulation abschaltet, solange er läuft, sodass jemand, der Ihren Lesebildschirm an einer Kasse öffnet, erst wieder mit dem Telefon zahlen kann, wenn er ihn verlässt.
Er sucht nur nach den Technologien, die Sie benennen, über Schalter wie FLAG_READER_NFC_A oder FLAG_READER_NFC_V. Ein Bildschirm für Etiketten nach ISO/IEC 15693, der allein nach NFC-V sucht, reagiert nicht auf eine Bankkarte daneben.
FLAG_READER_SKIP_NDEF_CHECK hält die Plattform davon ab, den Tag vor Ihrem Rückruf auf NDEF zu lesen. Die Referenz nennt den Preis deutlich: die Klasse Ndef wird dann auf dem Tag nicht aufgeführt, und die Zustellung über NDEF funktioniert nicht. Es ist der Schalter für einen Bildschirm, der eigene Befehle sendet, und der falsche für einen, der Nachrichten liest.
FLAG_READER_NO_PLATFORM_SOUNDS bringt den Erkennungston des Systems zum Schweigen, was Ihrer Anwendung die Aufgabe überlässt, der Nutzerin oder dem Nutzer zu sagen, dass etwas geschehen ist. Der Zusatz EXTRA_READER_PRESENCE_CHECK_DELAY setzt die Wartezeit, mit der die Plattform prüft, ob der Tag noch da ist.
Tags kommen über onTagDiscovered an statt als Absichten. Ab API-Ebene 37 hat der Rückruf auch onTagLost, der beim Verschwinden des Tags aufgerufen wird; davor zeigt sich ein Verschwinden als Ausnahme beim nächsten Austausch.
Für ein Telefon, das über Host Card Emulation eine Karte emuliert, empfiehlt die Referenz FLAG_READER_NFC_A zusammen mit FLAG_READER_SKIP_NDEF_CHECK.
Was die Vordergrund-Zustellung beibehält
Die Vordergrund-Zustellung ändert, wer den Tag bekommt, und sonst wenig. Die Plattform liest den Tag weiterhin auf NDEF und spielt weiterhin ihren Erkennungston, da der Schalter zum Verstummen zum Lesemodus gehört, und nichts in der Referenz hält die Kartenemulation an, solange sie eingeschaltet ist.
Der Tag kommt als Absicht an, über die PendingIntent, die Sie übergeben. Der Leitfaden zu fortgeschrittenem NFC baut sie mit FLAG_MUTABLE, weil das System den Tag in die Absicht einfügen muss, und seit Android 12 verlangt die Referenz zu PendingIntent, dass jede PendingIntent ihre Veränderbarkeit angibt. Dasselbe Beispiel fügt FLAG_ACTIVITY_SINGLE_TOP hinzu, damit der Tag die offene Aktivität in onNewIntent erreicht, statt eine zweite Kopie zu starten.
Filter und Technologielisten grenzen ein, was die Aktivität bekommt, nach denselben Regeln wie im Manifest. Wer für beide null übergibt, lässt die Aktivität jeden Tag über ACTION_TAG_DISCOVERED empfangen, eine Aktion, die die Referenz ab API-Ebene 37 als veraltet kennzeichnet.
Die Zustellung landet in onNewIntent, und der Leitfaden zu Prozessen und Threads sagt, dass Rückrufe des Lebenszyklus immer im Hauptthread laufen. Jeder Austausch mit dem Tag muss woandershin, da die Referenz zu TagTechnology Ein- und Ausgabe in diesem Thread verbietet.
Die Wahl zwischen beiden
| Frage | Lesemodus | Vordergrund-Zustellung |
|---|---|---|
| Wie der Tag ankommt | Ein Rückruf, onTagDiscovered | Eine Absicht, in onNewIntent |
| Kartenemulation währenddessen | Angehalten | Unverändert |
| Gesuchte Technologien | Nur die von Schaltern benannten | Alle |
| NDEF-Prüfung und Ton des Systems | Überspringbar | Immer ausgeführt |
| Verfügbar ab | API-Ebene 19 | API-Ebene 10 |
Nehmen Sie den Lesemodus, wenn der Bildschirm zum Lesen von Tags da ist: eine Bestandsprüfung, ein Werkzeug zum Einrichten, ein Lesegerät für eine eigene Karte. Der Tag geht direkt an Ihren Code, und nichts sonst auf dem Telefon streitet darum.
Nehmen Sie die Vordergrund-Zustellung, wenn Tags eine Eingabe unter mehreren sind und das Telefon weiter zahlen und sich normal verhalten soll, solange Ihre Aktivität offen ist.
Häufige Fragen
Warum zahlt das Telefon nicht mehr, solange meine Anwendung offen ist?
Der Lesemodus ist eingeschaltet. Die Referenz hält fest, dass er die Kartenemulation abschaltet, solange die Aktivität im Vordergrund ist, also bleibt er Bildschirmen vorbehalten, die zum Lesen da sind.
Welche Schalter braucht es, um ein anderes Telefon zu lesen?
Für ein Telefon, das über Host Card Emulation eine Karte emuliert, empfiehlt die Referenz FLAG_READER_NFC_A zusammen mit FLAG_READER_SKIP_NDEF_CHECK.
Brauche ich trotzdem Absichtsfilter im Manifest?
Nur für Tags, die die Anwendung starten sollen, wenn sie nicht offen ist. Weder der Lesemodus noch die Vordergrund-Zustellung gilt, bevor eine Aktivität auf dem Bildschirm ist.
Warum löst enableForegroundDispatch eine IllegalStateException aus?
Der Aufruf kam, während die Aktivität nicht im Vordergrund war, etwa aus onCreate. Schalten Sie sie in onResume ein und in onPause wieder aus.