Android SensorService源码分析(二)

继续上一篇文章,继续分析关于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

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值