继续上一篇文章,继续分析关于SensorService的第三和第四部分:
三: 应用注册Sensor数据监听的过程
四: sensor数据分发的过程
三 应用注册Sensor数据监听的过程。
1 SystemSensorManager 的 registerListenerImpl 函数
protected boolean registerListenerImpl(SensorEventListener listener, Sensor sensor, int delayUs, Handler handler, int maxBatchReportLatencyUs, int reservedFlags) {
synchronized (mSensorListeners) {
SensorEventQueue queue = mSensorListeners.get(listener);
if (queue == null) {
queue = new SensorEventQueue( listener, looper, this, fullClassName);
if (!queue.addSensor( sensor, delayUs, maxBatchReportLatencyUs)) {
queue.dispose();
return false;
}
mSensorListeners.put(listener, queue);
return true;
} else {
return queue.addSensor(sensor, delayUs, maxBatchReportLatencyUs);
}
}
}
SensorEventListener:需要实现的监听接口,用于返回数据。
sensor: 传感器有很多,陀螺仪,接近传感,加速度,重力等等。
mSensorListeners: 以listener为key保存,SensorEventQueue对象。
SensorEventQueue: 这个类比较重要,也是这次注册的重点。在native层它还会通过SensorManager与SensorService交互创建连接( ISensorEventConnection )。 这个连接虽然是一个Binder代理对象,这个Binder对象主要用来获取数据的Socket的fd,然后创建一个Receiver对象,监听这个fd的数据,并分发接收到的数据到监听java层SystemSensorManager的SensorEventQueue中。
这个函数做如下三件事:
1.1 从mSensorListeners找到listener对应的 SensorEventQueue ,如果不存在创建SensorEventQueue对象。
1.2 把Sensor加入到SensorEventQueue中
1.3 然后把listener和对应的SensorEventQueue保存到mSensorListeners中。
2 从mSensorListeners找到listener对应的SensorEventQueue,如果不存在创建SensorEventQueue对象。SensorEventQueue继承自BaseEventQueue类,构建它的一些重要信息就在父类的构造函数中。
BaseEventQueue(Looper looper, SystemSensorManager manager, int mode, String packageName) {
nSensorEventQueue = nativeInitBaseEventQueue( manager.mNativeInstance, new WeakReference<>(this), looper.getQueue(), mScratch, packageName, mode, manager.mContext.getOpPackageName());
}
它的构造函数主要是调用Native函数nativeInitSensorEventQueue()
manager.mNativeInstance: 指向Native层的SensorManager对象。
nSensorEventQueue: 保存Native层的Receiver对象,下面会有对Receiver对象的详细介绍。
3 static jlong nativeInitSensorEventQueue(JNIEnv *env, jclass clazz, jlong sensorManager, jobject eventQWeak, jobject msgQ, jfloatArray scratch, jstring packageName, jint mode) {
SensorManager* mgr = reinterpret_cast(sensorManager);
......
spqueue(mgr->createEventQueue(clientName, mode));
......
spmessageQueue = android_os_MessageQueue_getMessageQueue(env, msgQ);
......
spreceiver = new Receiver(queue, messageQueue, eventQWeak, scratch);
receiver->incStrong((void*)nativeInitSensorEventQueue);
return jlong(receiver.get());
}
3.1 把地址sensorManager转换成native层SensorManager对象mgr
3.2 调用SensorManager的createEven