主要是一种用于在运行的程序中,处理NFC tag的技术,使得当前Activity能直接响应NFC标签,而不需要用户在选择所有能处理的Activity,之所以要使用到此系统的原因,就是因为当android设备扫描到一个NFC tag,通用的行为是自动找最合适的Activity会处理这个tag Intent而不需要用户来选择哪个Activity来处理。因为设备扫描NFC tags是在很短的范围和时间,如果让用户选择的话,那就有可能需要移动设备,这样将会打断这个扫描过程,从而中断该连接。
在实现当前Activity能直接响应NFC标签这个功能中使用到了tag分发系统,其包括了Intent发布系统与前台Activity发布系统,帮助正确的识别一个NFC tag是否是你的Activity想要处理的。对于前台Activity发布系统与Intent发布系统各自的作用为:
- 前台发布系统允许一个Activity覆盖掉Intent发布系统而首先处理此tag Intent,这要求你将要处理Tag Intent的Activity运行在前台,这样当一个NFC tag被扫描到,系统先检测前台的Activity是否支持处理此Intent,如果支持,即将此Intent传给此Activity,如果不支持,则转到Intent发布系统。
- Intent发布系统检查所有Activities的intent filters,找出那些定义了可以处理此tag的Activity,如果有多个Activity都配置了处理同一个tag Intent,那么将使用Activity选择器来让用户选择使用哪个Activity。用户选择之后,将使用选择的Activity来处理此Intent.
2.2.5 NFC标签调度系统及标签解析过程
NFC标签调度系统用于分析扫描到的NFC标签,通过解析数据,在被扫描到的数据中尝试找到最适合的应用程序。
当系统检测到一个NFC标签的时候,会自动去寻找最合适的activity去处理这个intent.而此Intent定义了三种action:ACTION_NDEF_DISCOVERED、ACTION_TECH_DISCOVERED、ACTION_NDEF_DISCOVERED,三种action具体为:
ACTION_NDEF_DISCOVERED:当系统检测到tag中含有NDEF格式的数据时,且系统中有activity声明可以接受包含NDEF数据的Intent的时候,系统会优先发出这个action的intent。
ACTION_TECH_DISCOVERED:当没有任何一个activity声明自己可以响应ACTION_NDEF_DISCOVERED时,系统会尝试发出TECH的intent.即便tag中所包含的数据是NDEF的,但如果这个数据的MIME type或URI不能和任何一个activity所声明的吻合,系统也一样会尝试发出tech格式的intent,而不是NDEF.
ACTION_TAG_DISCOVERED:当系统发现前两个intent在系统中无人会接受的时,会用一个标签技术信息相关的默认Tag对象来代替,发送此默认的TAG类型的。
NFC标签调度系统对NFC标签进行解析的过程为:
1. 对接收到的NFC标签数据进行解析,搞清楚标签中标识数据负载的MIME类型或URI等信息。
2. 将MIME类型或URI等数据以及数据负载封装到一个Intent中。
3. 基于Intent来启动Activity,将Intent对象发送给感兴趣的应用程序(以下几点为对第三点完成过程的具体阐述)。
4. 用解析NFC标签时由标签调度系统创建的Intent对象(ACTION_NDEF_DISCOVERED或ACTION_TECH_DISCOVERED)来尝试启动Activity;
5. 如果没有对应的处理Intent的Activity,那么就会尝试使用下一个优先级的Intent(ACTION_TECH_DISCOVERED或ACTION_TAG_DISCOVERED)来启动Activity,直到有对应的应用程序来处理这个Intent,或者是直到标签调度系统尝试了所有可能的Intent。
6. 如果没有应用程序来处理任何类型的Intent,那么就不做任何事情。
下图为标签调度的流程:
而NFC标签过滤有四种即使用上述提过知识点进行:1.过滤ACTION_NDEF_DISCOVERED 。2.过滤ACTION_TECH_DISCOVERED 。3.过滤ACTION_TAG_DISCOVERED 。4.nfc标签前台调度系统。各种方法的具体实现可去查看下方的参考博客链接。
进行支持NFC程序的开发时的基本步骤为:
1. 在AndroidManifest.xml中进行权限声明以及添加intent-filter过滤器进行支持。
进行权限声明: