在上一章Android Sensor框架简述(二) 中,我们最后介绍了应用层获取HAL层上报数据的方式。然而内部的实现逻辑并没有理清楚,现在,看看sensorManager是如何实现监听数据的。
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
这是获取sensorManager
的语句,getSystemService
方法实际上调用了registerService
来获得一个SystemSensorManager
的对象
registerService(SENSOR_SERVICE, new ServiceFetcher() {
public Object createService(ContextImpl ctx) {
return new SystemSensorManager(ctx.getOuterContext(),
ctx.mMainThread.getHandler().getLooper());
}});
SystemSensorManager对象的构造函数使用了JNI的方式获取了一个SensorManager::getInstance()
获取了SensorManager的一个单例,并调用了getSensorList
的方法,到最终调用了sensorService的的getSensorList
方法。
Vector SensorService::getSensorList()
{
char value[PROPERTY_VALUE_MAX];
property_get("debug.sensors", value, "0");
if (atoi(value)) {
return mUserSensorListDebug;
}
return mUserSensorList;
}
mLightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
getDefaultSensor
调用了getSensorList(type)
获取指定type的sensor.
/**
* Use this method to get the list of available sensors of a certain type.
* Make multiple calls to get sensors of different types or use
* {@link android.hardware.Sensor#TYPE_ALL Sensor.TYPE_ALL} to get all the
* sensors.
*
* @param type
* of sensors requested
*
* @return a list of sensors matching the asked type.
*
* @see #getDefaultSensor(int)
* @see Sensor
*/
public List getSensorList(int type) {
// cache the returned lists the first time
List list;
final List fullList = getFullSensorList();
synchronized (mSensorListByType) {
list = mSensorListByType.get(type);
if (list == null) {
if (type == Sensor.TYPE_ALL) {
list = fullList;
} else {
list = new ArrayList();
for (Sensor i : fullList) {
if (i.getType() == type)
list.add(i);
}
}
list = Collections.unmodifiableList(list);
mSensorListByType.append(type, list);
}
}
return list;
}
mLightSensorListener = new SensorEventListener();
这个定义主要是重写了onSensorChanged()
和onAccuracyChanged()
方法,这两个分别是在传感器的数据和精度发生变化的时候进行处理的监听器,代码不再贴。
sensorManager.registerListener(this,gyroscopeSensor,10000);
registerListener
调用systemSensorManager
的registerListenerImpl()
方法,主要是定义了消息泵Looper,消息队列sensorEventQueue。Looper的实现也是JNI的方式,绑定了一个回调函数handleEvent
,再调用了dispatchSensorEvent
方法。
在dispatchSensorEvent
的最后,我们看到了mListener.onSensorChanged(t);
,调用该函数做处理。
PS:由于内核代码涉及到机密,部分自定义的代码不贴出来了,源码可以在Google找到。
博主负责的部分不是上层,所以有些机制很能非常深入了解。SensorManager获取数据的大概方式就是如此了。HAL负责数据的上报,SensorManager负责接收给应用使用,中间可以对传感器数据进行处理,滤波,校准等等。