NFC(4)响应NFC设备时启动activity的四重过滤机制
响应NFC设备时启动activity的四重过滤机制
在一个NFC设备读取NFC标签或另一个NFC设备中的数据之前会在0.1秒之内建立NFC连接,然后数据会自动从被读取一端流向读取数据的一端(NFC设备一般需要触摸一下屏幕才开始传输)。数据接收端会根据具体的数据格式和标签类型调用相应的Activity(这种行为也称为Tag Dispatch)。这些Activity都需要定义Intent Filter。这些Intent Filter中就会指定不同的过滤机制,分为3个级别。因此,也称为NFC的四重过滤机制。
NDEF_DISCOVERED | 只过滤固定格式的NDEF数据。例如,纯文本、指定协议(http、ftp、smb等)的URI等。 |
TECH_DISCOVERED |
当ACTION_NDEF_DISCOVERED指定的过滤机制无法匹配Tag时,就会使用这种过滤机制进行匹配。 这种过滤机制并不是通过Tag中的数据格式进行匹配的,而是根据Tag支持的数据存储格式进行匹配。因此这种过滤机制的范围更广。 |
TAG_DISCOVERED |
如果将NFC的过滤机制看成是if… elseif…else语句的话,那么这种过滤机制就相当于else语句。前面两种过滤机制都失败后, 系统就会利用这种过滤机制来处理。这种过滤机制用来处理未识别的Tag(数据格式不对,而且Tag支持的格式也不匹配)。 |
用代码 NfcAdapter 注意它的activity要 android:launchMode="singleTop" |
NfcAdapter.enableForegroundDispatch(Activity activity, android.app.PendingIntent intent, android.content.IntentFilter[] filters, String[][] techLists) NfcAdapter.disableForegroundDispatch(Activity activity) |
Android系统会依次匹配NDEF_DISCOVERED、TECH_DISCOVERED和TAG_DISCOVERED。如果通过四重过滤机制仍然无法匹配Tag,则什么都不做。通常在成功匹配Tag后,Android设备会发出比较清脆的声音,而未成功匹配Tag,就会发出比较沉闷的声音。
响应流程如下:
如:
1 <activity 2 android:name=".TagTextActivity" 3 android:label="显示纯文本NFC标签的内容" 4 android:launchMode="singleTask" > 5 <intent-filter> 6 <!-- 指定了NDEF_DISCOVERED --> 7 <action android:name="android.nfc.action.NDEF_DISCOVERED" /> 8 <category android:name="android.intent.category.DEFAULT" /> 9 <!-- 指定了纯文本格式 --> 10 <data android:mimeType="text/plain" /> 11 </intent-filter> 12 </activity>