mSensorList[i] = mSensors.array() + i; } }
return NO_ERROR; }
View Code
前面我们讲到过,SensorService的创建的时候调用了defaultServiceManager:getService()将服务添加到了系统服务管理中。
现在我们又调用defaultServiceManager::geService()获取到SensorService服务的实例。 在通过IBind通信,就可以获取到Sensor列表,所以在客户端初始化的时候,做了两件事情: 1. 获取SensorService实例引用 2. 获取Sensor传感器列表
注册SensorLisenter
时序图
new ListenerDelegate(SensorEventListener listener, Sensor sensor, Handler handler) 在这个构造函数中会创建一个Handler,它会在获取到Sensor数据的时候被调用。
mHandler = new Handler(looper) { @Override
public void handleMessage(Message msg) {
final SensorEvent t = (SensorEvent)msg.obj; final int handle = t.sensor.getHandle();
switch (t.sensor.getType()) {
// Only report accuracy for sensors that support it.
case Sensor.TYPE_MAGNETIC_FIELD: case Sensor.TYPE_ORIENTATION:
// call onAccuracyChanged() only if the value changes
final int accuracy = mSensorAccuracies.get(handle);
if ((t.accuracy >= 0) && (accuracy != t.accuracy)) {
mSensorAccuracies.put(handle, t.accuracy);
mSensorEventListener.onAccuracyChanged(t.sensor, t.accuracy);
}
break; default:
// For other sensors, just report the accuracy once
if (mFirstEvent.get(handle) == false) { mFirstEvent.put(handle, true);
mSensorEventListener.onAccuracyChanged(
t.sensor, SENSOR_STATUS_ACCURACY_HIGH);
}
break; }
mSensorEventListener.onSensorChanged(t); sPool.returnToPool(t);
} };
View Code
创建消息队列
时序图
当客户端第一次注册监听器的时候,就需要创建一个消息队列,也就是说,android在目前的实现中,只创建了一个消息队列,一个消息队列中有一个管道,用于服务端与客户断传送Sensor数据。
在SensorManager.cpp中的createEventQueue方法创建消息队列: