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

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Android移动开发中,Android设备可以利用光线传感器监测光照强度。光线传感器是一种测量环境光强度的传感器,它可以感知周围环境的光线水平。通过使用光线传感器,开发人员可以实现各种功能和应用。 要实现光线传感器的监测光照强度,首先需要在Android应用程序中引入相关的传感器API。然后,可以通过注册传感器事件监听器来监听光线传感器数据的变化。 一旦传感器数据发生变化,应用程序可以获取当前的光照强度值。这个值可以用来自动调节屏幕亮度、改变应用程序的界面布局或触发其他与光照有关的操作。 需要注意的是,不同的Android设备可能具有不同的传感器配置。因此,在开发应用时,需要考虑到设备的传感器支持情况,并进行适当的处理。 总结来说,Android设备利用光线传感器监测光照强度的实现需要引入传感器API,并注册传感器事件监听器来获取光照强度数据。这个功能可以用于各种应用,例如自动调节屏幕亮度或触发与光照有关的操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Android 传感器概述](https://blog.csdn.net/qq_35427437/article/details/79936432)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fighting Horse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值