栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Android 源码分析 - 传感器 - 流程

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android 源码分析 - 传感器 - 流程

服务创建过程
  1. SensorService::onFirstRef
    1. SensorDevice::getInstance
      1. new SensorDevice
        1. hw_get_module
        2. sensors_open_1
        3. mSensorModule->get_sensors_list
    2. dev.getSensorList
      1. mSensorModule->get_sensors_list
    3. foreach list
      1. registerSensor(new HardwareSensor)
    4. SensorFusion::getInstance
    5. if (hasGyro)(如果有陀螺仪)
      1. registerVirtualSensor(new RotationVectorSensor)
      2. registerVirtualSensor(new GravitySensor)
      3. registerVirtualSensor(new LinearAccelerationSensor)
      4. registerVirtualSensor(new OrientationSensor)

应用创建过程
  1. SystemSensorManager.SystemSensorManager
    1. nativeClassInit(jni方法)
    2. do
      1. nativeGetNextSensor(jni方法)
        1. SensorManager::getInstance(libgui)
        2. mgr.getSensorList
          1. assertStateLocked
            1. getService(获取SensorService接口代理)
            2. mSensorServer->getSensorList

注册Listener
  • 应用层处理
  1. SensorManager.registerListener
    1. SystemSensorManager.registerListenerImpl
      1. mSensorListeners.get(通过listener查找queue)
      2. if (queue == null)
        1. new SensorEventQueue(一个queue对应一个listener)
          1. baseEventQueue.baseEventQueue
            1. nativeInitbaseEventQueue(nativeInitSensorEventQueue)
              1. SensorManager::getInstance
              2. mgr.createEventQueue
                1. mSensorServer->createSensorEventConnection(binder调用)
                  1. new SensorEventQueue
              3. new Receiver
        2. queue.addSensor
          1. enableSensor
            1. nativeEnableSensor
              1. SensorEventQueue::enableSensor
                1. mSensorEventConnection->enableDisable(binder调用)
        3. mSensorListeners.put
      3. else
        1. queue.addSensor
  • 服务层ISensorServer处理createSensorEventConnection
  1. SensorService::createSensorEventConnection
    1. new SensorEventConnection
      1. SensorDevice::getInstance
      2. new BitTube(内部包含BitTube)
  • 服务层ISensorEventConnection处理enableDisable
  1. SensorService::SensorEventConnection::enableDisable
    1. mService->enable(SensorService::enable)
      1. if (rec == 0)(没有对应该传感器的记录)
        1. new SensorRecord(connection)
      2. else
        1. rec->addConnection
        2. if (sensor MinDelay == 0)(不是一个连续事件传感器)
          1. connection->sendEvents(发送最后一次的值)
      3. connection->addSensor
      4. sensor->batch(HardwareSensor::batch,先调用batch)
        1. mSensorDevice.batch
      5. connection->setFirstFlushPending(只有该连接等待flush完成事件)
      6. sensor->flush(再调用flush)
      7. sensor->activate(再调用activate)
        1. mSensorDevice.activate

        通过setFirstFlushPending机制,过滤enable时硬件缓存中的事件。

        也有可能是虚拟传感器,其batch方法只会调用setDelay,而setDelay,active方法会调用硬件传感器对应的方法。

注销Listener
  • 应用层处理
  1. SensorManager.unregisterListener
    1. SystemSensorManager.unregisterListenerImpl
      1. mSensorListeners.get
      2. queue.removeSensor(baseEventQueue)
        1. disableSensor
          1. nativeDisableSensor
            1. mSensorListeners.remove
                1. SensorEventQueue::disableSensor
                  1. mSensorEventConnection->enableDisable(binder调用)

  • 服务层ISensorEventConnection处理enableDisable
  1. SensorService::SensorEventConnection::enableDisable
    1. mService->disable(SensorService::disable)
      1. cleanupWithoutDisableLocked
        1. connection->removeSensor
      2. sensor->activate
        1. mSensorDevice.activate

刷新flush
  • 应用层处理
  1. SensorManager.flush
    1. SystemSensorManager.flushImpl
      1. nativeFlushSensor
        1. SensorEventQueue::flush(libgui)
          1. mSensorEventConnection->flush(binder调用)
  • 服务层处理
  1. SensorService::SensorEventConnection::flush
    1. foreach mSensorInfo(所有关注的传感器同时flush)
      1. if (halVersion < SENSORS_DEVICE_API_VERSION_1_1 || isVirtualSensor)
        1. flushInfo.mPendingFlushEventsToSend++(模拟一个flush完成事件)
      2. else
        1. mService->flushSensor(SensorService::flushSensor)
          1. sensor->flush(HardwareSensor::flush)
            1. mSensorDevice.flush(SensorDevice::flush)
              1. mSensorDevice->flush(sensors_poll_device_1_t)

        注意:应用也可能收到其他应用调用硬件flush引起的flush完成事件。

 事件传递
  • 服务层获取发送事件
  1. SensorService::threadLoop
    1. SensorDevice::getInstance
    2. device.poll
    3. recordLastValue
    4. if (fusion.isEnabled())
      1. fusion.process(处理所有的事件)
      2. 虚拟传感器处理事件,生成新的事件
    5. foreach mActiveConnections(每个活动的连接,都发送事件)
      1. connection->sendEvents
        1. 连接自己过滤事件
          1. 不是自己关注的传感器事件,跳过
          2. 对该传感器处于flush等待状态,跳过
        2. foreach mSensorInfo(发送等待的flush完成事件)
          1. while (flushInfo.mPendingFlushEventsToSend > 0)
            1. SensorEventQueue::write(发送flush完成事件)
          2. SensorEventQueue::write
          3. if (size == -EAGAIN)(发送阻塞,丢弃非flush完成事件)
            1. countFlushCompleteEventsLocked(统计flush完成事件)
      2. cleanupAutoDisabledSensor
        1. foreach events(所有事件)
          1. if (type == SENSOR_TYPE_SIGNIFICANT_MOTION)(特定类型)
            1. if (connection->hasSensor)(连接关注该事件对应的传感器)
              1. sensor->autoDisable
                1. SensorDevice::autoDisable
              2. cleanupWithoutDisable
  • 应用层回调Listener
  1. Receiver.handleEvent
    1. SensorEventQueue::read(读取多个事件)
    2. for events(一个事件调用一次回调)
      1. env->CallVoidMethod(SensorEventQueue::dispatchSensorEvent)
        1. System.arraycopy(只拷贝实际矢量长度)
        2. 该传感器精度变化或者第一个事件
          1. mListener.onAccuracyChanged
        3. mListener.onSensorChanged

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/352023.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号