Android Jelly Beam NFC架构及源码分析之一

2024-03-27 05:50

本文主要是介绍Android Jelly Beam NFC架构及源码分析之一,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文首先是一些准备资料,主要来源是度娘,在此感谢原作者。在准备资料了解后,及第三节开始算正式步入正题。

一、手机NFC架构

目前手机主要是S2C(SigIn-SigOut-Connection)架构,主要是避免NFC标签(即NFC卡)与NFC装置(即NFC读卡机、存取器)两者在感应时,被其他有心人士从中、从旁对传输资料进行拦窃。如下图:

二、Android NFC架构

具体内容参见 http://blog.csdn.net/mutouyueliang/archive/2011/03/08/6232028.aspx

三、NFC Service的启动和初始化

OK,现在开始进入正题。

NFC Service本质上是一个系统APP,和Phone类似。注意在~/packages/app/Nfc/AndroidManifest.xml中设置了android:persistent="true"。所以在AM(ActivityManager)启动后,AM会启动NFC service.这个时候进入NFC service的启动流程。

根据JAVA类实例化的顺序我们知道,首先系统会创建一个NfcServiceHandler, 这个handler在服务完全启动后承担着主要的作用。之后会详细的写。

后面会执行到onCreate函数,这个时候会先实例化TagService,NfcAdapterService,NfcAdapterExService这三个内部类,而这三个类是分别对~/platform/frameworks/base/core/java/android/nfc下面几个aidl的实现。其中NfcAdpaterService会在NfcService启动后注册到ServiceManager里面去,暴露给其他进程一些基本的方法,如启用和禁用NFC设备。

之后实例化NativeNfcManager,这个时候就会载入JNI,然后在JNI这一层里面创建了一个monitor(其实就是几个semaphores, mutex 以及条件变量,这个monitor在后面用处很大,因为android nfc的操作都是异步操作又是多线程,所以为了确保唯一性和顺序性,以及阻塞线程)和一个nfc_jni_native_data这个native_data会存放NativeNfcManager这个的实例。事实上和JNI交互以及在应用层干实事的就是NativeNfcManager。

然后会创建HandoverManager(主要是处理Handover消息,理论上可以处理wifi和bluetooth,实际上目前主要是用来建立蓝牙连接,Android目前P2p传输文件其实就是通过handover建立蓝牙连接,然后通过蓝牙传输数据),NfcDispatcher以及P2pLinkManager。从名字都可以看出来NfcDispather是负责消息的分发,P2pLinkManager是用来处理P2p链接的。这里主要说下P2pLinkManager,它实现了两个接口,分别是Handler.Callback和P2pEventListener.Callback,所以我们可以看到在类的构造函数中,实例化P2pEventManager和Handler的时候会将自身传进去。当然这个Handler和前面的NfcServiceHandler公用一个MessageQueue和一个Looper,只是不知道两个handleMessage是如何处理的(望知情人士讲解下)。此外这一个步骤和前面一个步骤(实例化NativeNfcManager)是可以交换顺序的。

到了这里后会启动安全管理模块、Access control等,内容很简单,同时也不是重点,就略过了。这之后是将NfcAdpater注册到ServiceManager里面,然后是自身注册Receiver,主要用来处理一些系统事件,如锁屏,App安装等。

实事上到了这里我们的操作大部分都还是在应用层,最多到JNI,然而即使到了JNI我们也只是在内存上给两个变量分配了空间而已,并未操作硬件,甚至于我们还不知道这个手机是否安装的有NFC芯片。NFC设备的初始化和真正的启用其实到最后一句 new EnableDisableTask().execute(TASK_BOOT)才开始执行的。

 这一句首先是创建了一个异步Task,然后开始执行启动操作。也就说是另起了一个线程,然后开始初始化设备。

 

好吧,时间太晚,明天继续。

转载于:https://www.cnblogs.com/jecofang/archive/2013/04/17/3023065.html

这篇关于Android Jelly Beam NFC架构及源码分析之一的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/851123

相关文章

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

Java异常架构Exception(异常)详解

《Java异常架构Exception(异常)详解》:本文主要介绍Java异常架构Exception(异常),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. Exception 类的概述Exception的分类2. 受检异常(Checked Exception)

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式

Spring、Spring Boot、Spring Cloud 的区别与联系分析

《Spring、SpringBoot、SpringCloud的区别与联系分析》Spring、SpringBoot和SpringCloud是Java开发中常用的框架,分别针对企业级应用开发、快速开... 目录1. Spring 框架2. Spring Boot3. Spring Cloud总结1. Sprin