[在Android上使用NFC时,我有些失落。
我要执行以下操作:-使用一个NFC标签作为令牌-在Android上阅读并显示一些功能-如果手机已从令牌双向消息中删除-如果电话重新连接或连接到另一个令牌,则显示另一个功能
[我在AndroidManifest文件中将android.nfc.action.NDEF_DISCOVERED
使用了意图过滤器,在XML中过滤了android.nfc.action.TECH_DISCOVERED
。
主活动成功打开,并且如果附加了另一个标签
@Override
protected void onNewIntent(Intent intent) { ...}
被叫。
我还使用计时器检查标签是否仍在连接(基本上是ndefTag.connect()
; NdefMessage ndefMsg= ndefTag.getNdefMessage();
,然后查看是否接收到任何东西。
我将“活动”的启动模式设置为android:launchMode="singleInstance
,否则,每次将新标签放入电话后,应用程序都会完全重启。
现在我完全失去了意图系统,因为通常main会启动其他活动,而意图是由于当前活动和当前屏幕信息的丢失而跳回main。
所以我的问题是关于两个部分的:-真的如此复杂,需要使用意图吗?不能,我只是以某种方式连接到电话的NFC读取器,并且每隔几秒钟就轮询一次?询问是否已连接标签,标签上有什么数据。通过NDEF_DISCOVERED / TECH_Discovered组合,我发现有时它会挂起。 (同样,如果不是SingleInstance-Activity,则有时也不会启动新活动)。 (首选)-还是有一些干净的方法可以将NFC意图转发到应用程序的实际活动?还是说在运行时不应该调用main而是一些处理连接的后台任务?
是,可以在没有意图的情况下读取NFC卡,并且这是一个更加可靠的过程,尤其是在写入卡时
使用enableReaderMode
代替https://developer.android.com/reference/android/nfc/NfcAdapter#enableReaderMode(android.app.Activity,%20android.nfc.NfcAdapter.ReaderCallback,%20int,%20android.os.Bundle)
[基本上,您会找到一个Set,当发现Tag时将调用该回调函数,该回调函数将在单独的线程中运行,而不是将Intent传递到主UI线程。
而enableForegroundDispatch
则您的应用程序暂停,而系统应用程序读取卡,然后恢复您的应用程序并将其传递给新意图。这种暂停可能是您失去活动状态的原因。
使用enableReaderMode
,您的应用在读取卡时不会暂停。
基本操作是:-
1)实现回调方法
2)OnResume enableReaderMode和OnPause disableReaderMode
3)在onTagDsicovered中(回调函数)连接到标签,使用尝试块循环处理getNdefMessage
,以处理标签离开读取范围或循环测试isConnected
4)runOnUiThread基于NDEF消息的所需操作
5)当标签离开读取范围时(或仅让读取器回调线程退出,准备读取新卡时,请执行您想做的事情。