NFC Intent發佈系統
Intent發佈系統也被稱為標籤調度系統,調度系統定義了三種類型的action,見下表:
所以標籤的上報根據標籤中數據的不同而採用不同的action,大致流程如下圖:
唯一需要注意的是在ACTION_NDEF_DISCOVERED上報時還需要考慮AAR,NFC AAR的實現可以參考其他文章,這裡就不多贅述。
1 ACTION_NDEF_DISCOVERED
如果Application想過濾ACTION_NDEF_DISCOVERED的Intent,則其需要在你apk的清單文件AndroidManifest.xml中添加上intent-filter分過濾條件,一般的過濾條件設置如下:
<code><activity>
…
<intent-filter>
<action>
<category>
<data>
... />
/<data>/<intent-filter>
...
/<activity>/<code>
過濾條件data下的內容根據Application感興趣的標籤而定,具體可參考《Professional NFC Application Development for Android.pdf》,這本書中做了比較詳細的說明。
2 ACTION_TECH_DISCOVERED
Application如果對ACTION_TECH_DISCOVERED的Intent感興趣,則需要在apk的清單文件中加入如下格式的過濾條件:
<code><activity>
...
<intent-filter>
<action>
/<intent-filter>
android:resource="@xml/nfc_tech_list" />
...
/<meta-data>/<activity>/<code>
在上面的基本格式中,meta-data中包含這樣一條語句:android:resource="@xml/nfc_tech_list",這是一個XML的資源文件,該文件在過濾ACTION_TECH_DISCOVERED的Intent時是必須創建的。它指定了該apk支持的標籤技術,只有你在XML中定義的標籤技術是上報的Tag支持的標籤技術的一個子集,這樣你的Activity才能被系統過濾出來。
Nfc_tech_list是資源文件的文件名,可以根據自己的文件名而改動。但是文件的存放路徑必須是 /res/xml/ 文件夾下,基本格式如下:
<code><resources>
<tech-list>
<tech>android.nfc.tech.IsoDep/<tech>
<tech>android.nfc.tech.NfcA/<tech>
<tech>android.nfc.tech.NfcB/<tech>
<tech>android.nfc.tech.NfcF/<tech>
<tech>android.nfc.tech.NfcV/<tech>
<tech>android.nfc.tech.Ndef/<tech>
<tech>android.nfc.tech.NdefFormatable/<tech>
<tech>android.nfc.tech.MifareClassic/<tech>
<tech>android.nfc.tech.MifareUltralight/<tech>
<tech>android.nfc.tech.NfcBarcode/<tech>
/<tech-list>
/<resources>/<code>
以上所列出的標籤技術是當前標籤支持的所有技術,Application可以根據自己的需要自由組合你的tech_list。也可以指定多個tech_list集合,每一個tech_list都認為是獨立的,所以在匹配過程中,只要有一個tech_list匹配成功就認為該Activity符合ACTION_TECH_DISCOVERED的Intent過濾條件。多個tech_list集合的格式如下:
<code><resources>
<tech-list>
<tech>android.nfc.tech.NfcB/<tech>
<tech>android.nfc.tech.Ndef/<tech>
/<tech-list>
/<resources>
<resources>
<tech-list>
<tech>android.nfc.tech.MifareClassic/<tech>
<tech>android.nfc.tech.NfcA/<tech>
/<tech-list>
/<resources>/<code>
3 ACTION_TAG_DISCOVERED
應用如果想過濾ACTION_TAG_DISCOVERED的Intent,同樣需要在清單文件中加入過濾條件,這樣在其他apk沒有過濾ACTION_NDEF_DISCOVERED和ACTION_TECH_DISCOVERED的Intent時,ACTION_TAG_DISCOVERED就會啟動。配置格式如下:
<code><activity>
...
<intent-filter>
<action>
/<intent-filter>
...
/<activity>/<code>
三種不同的action的Intent都有了比較詳細的說明,接下來讓我們看下這部分在android系統標籤上報中的時序圖:
Activity被啟動後一般會在onResume()中獲取到Intent,並從中讀取標籤的Tag對象和NDEF數據,這樣應用就可以基於獲取到的數據進行NFC數據操作。
閱讀更多 Connectivity 的文章