1 总体调用关系图
Sensor 框架分为三个层次,客户度、服务端、HAL层,服务端负责从HAL读取数据,并将数据写到管道中,客户端通过管道读取服务端数据。下面简单解释类的功能
1.1客户端主要类
n SensorManager.java
从android4.1开始,把SensorManager定义为一个抽象类,定义了一些主要的方法,类主要是应用层直接使用的类,提供给应用层的接口
n SystemSensorManager.java
继承于SensorManager,客户端消息处理的实体,应用程序通过获取其实例,并注册监听接口,获取sensor数据
n sensorEventListener接口
用于注册监听的接口
n sensorThread
是SystemSensorManager的一个内部类,开启一个新线程负责读取读取sensor数据,当注册了sensorEventListener接口的时候才会启动线程
n android_hardware_SensorManager.cpp
负责与java层通信的JNI接口
n SensorManager.cpp
sensor在Native层的客户端,负责与服务端SensorService.cpp的通信
n SenorEventQueue.cpp
消息队列
1.2服务端主要类
n SensorService.cpp
服务端数据处理中心
n SensorEventConnection
从BnSensorEventConnection继承来,实现接口ISensorEventConnection的一些方法,ISensorEventConnection在SensorEventQueue会保存一个指针,指向调用服务接口创建的SensorEventConnection对象
n Bittube.cpp
在这个类中创建了管道,即共享内存,用于服务端与客户端读写数据
n SensorDevice
负责与HAL读取数据
1.3 HAL层
Sensor.h是google为Sensor定义的Hal接口,这里我们主要介绍Framework层。sensor HAL介绍http://blog.sina.com.cn/s/blog_89f592f5010130c8.html
2客户端读取数据
2.1 调用时序图
2.2 代码分析
2.2.1 apk注册监听器
SensorManager mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); Sensor mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
protected void onResume() { super.onResume(); mSensorManager. registerListenerImpl (this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); } protected void onPause() { super.onPause(); mSensorManager.unregisterListener(this); }
public interface SensorEventListener { public void onSensorChanged(SensorEvent event); public void onAccuracyChanged(Sensor sensor, int accuracy); }
|
没有把全部代码写出来,Activity实现了SensorEventListener接口,在onCreate方法中,获取SystemSensorManager,并获取到加速传感器的Sensor,在onResume方法中调用SystemSensorManager. registerListenerImpl注册监听器,当Sensor数据有改变的时候将会回调onSensorChanged方法。
2.2.2初始化SystemSensorManager
public SystemSensorManager(Context context,Looper mainLooper) { mMainLooper = mainLooper; mContext = context;
synchronized(sListeners) { if (!sSensorModuleInitialized) { sSensorModuleInitialized = true;
nativeClassInit();
// initialize the sensor list sensors_module_init(); final ArrayList<Sensor> fullList = sFullSensorsList; int i = 0; do { Sensor sensor = new Sensor(); i = sensors_module_get_next_sensor(sensor, i);
if (i>=0) { //Log.d(TAG, "found sensor: " + sensor.getName() + // ", handle=" + sensor.getHandle()); fullList.add(sensor); sHandleToSensor.append(sensor.getHandle(), sensor); } } while (i>0);
sPool = new SensorEventPool( sFullSensorsList.size()*2 ); sSensorThread = new SensorThread(); } } } |
系统开机启动的时候,会创建SystemSensorManager的实例,在其构造函数中,主要做了四件事情:
n 初始化JNI
调用JNI函数nativeClassInit()进行初始化
n 初始化Sensor列表
调用JNI函数sensors_module_init,对Sensor模块进行初始化。创建了native层SensorManager的实例。
n 获取Sensor列表
调用JNI函数sensors_module_get_next_sensor()获取Sensor,并存在sHandleToSensor列表中
n 构造SensorThread类
构造线程的类函数,并没有启动线程,当有应用注册的时候才会启动线程
2.2.3启动SensorThread线程读取消息队列中数据
protected boolean registerListenerImpl(SensorEventListener listener, Sensor sensor, int delay, Handler handler) {
synchronized (sListeners) { ListenerDelegate l = null; for (ListenerDelegate i : sListeners) { if (i.getListener() == listener) { l = i; } } ……. // if we don't find it, add it to the list if (l == null) { < |