NFC Intent发布系统
Intent发布系统也被称为标签调度系统,调度系统定义了三种类型的action,见下表:
ACTIVITY_INTENT_ACTION 类型 | 作用 | 优先级 |
---|---|---|
ACTION_NDEF_DISCOVERED | 标签中含有NDEF数据且为公认类型 | 高 |
ACTION_TECH_DISCOVERED | 标签中没有NDEF数据却是已定义的标签技术 | 中 |
ACTION_TAG_DISCOVERED | 前两个action都没有启动,则启动这个 | 低 |
所以标签的上报根据标签中数据的不同而采用不同的action,大致流程如下图:
唯一需要注意的是在ACTION_NDEF_DISCOVERED上报时还需要考虑AAR,NFC AAR的实现可以参考其他文章,这里就不多赘述。
1 ACTION_NDEF_DISCOVERED
如果Application想过滤ACTION_NDEF_DISCOVERED的Intent,则其需要在你apk的清单文件AndroidManifest.xml中添加上intent-filter分过滤条件,一般的过滤条件设置如下:
条件data下的内容根据Application感兴趣的标签而定,具体可参考《Professional NFC Application Development for Android.pdf》,这本书中做了比较详细的说明。
2 ACTION_TECH_DISCOVERED
Application如果对ACTION_TECH_DISCOVERED的Intent感兴趣,则需要在apk的清单文件中加入如下格式的过滤条件:
在上面的基本格式中,meta-data中包含这样一条语句:android:resource="@xml/nfc_tech_list",这是一个XML的资源文件,该文件在过滤ACTION_TECH_DISCOVERED的Intent时是必须创建的。它指定了该apk支持的标签技术,只有你在XML中定义的标签技术是上报的Tag支持的标签技术的一个子集,这样你的Activity才能被系统过滤出来。
Nfc_tech_list是资源文件的文件名,可以根据自己的文件名而改动。但是文件的存放路径必须是 /res/xml/ 文件夹下,基本格式如下:
以上所列出的标签技术是当前标签支持的所有技术,Application可以根据自己的需要*组合你的tech_list。也可以指定多个tech_list集合,每一个tech_list都认为是独立的,所以在匹配过程中,只要有一个tech_list匹配成功就认为该Activity符合ACTION_TECH_DISCOVERED的Intent过滤条件。多个tech_list集合的格式如下:
3 ACTION_TAG_DISCOVERED
应用如果想过滤ACTION_TAG_DISCOVERED的Intent,同样需要在清单文件中加入过滤条件,这样在其他apk没有过滤ACTION_NDEF_DISCOVERED和ACTION_TECH_DISCOVERED的Intent时,ACTION_TAG_DISCOVERED就会启动。配置格式如下:
这样就把三种不同的action的Intent都做了比较详细的说明,接下来让我们看下这部分在android系统标签上报中的时序图:
Activity被启动后一般会在onResume()中获取到Intent,并从中读取标签的Tag对象和NDEF数据,这样应用就可以基于获取到的数据进行NFC数据操作。