Android 源码分析 - 传感器 - Java层

core/hardware

jni

        源代码位于:frameworks/base/core/jni/android_hardware_SensorManager.cpp

        JNI代码调用SensorManager(libgui中,单例)获取传感器列表,建立事件连接(SensorEventQueue)

        Receiver将事件连接的文件句柄与SystemSensorManager传过来的MessageQueue绑定,并处理传感器事件,回调java层的BaseEventQueue的相应方法。MessageQueue由Loopper驱动,所以Receiver是在Looper的驱动线程里回调java层方法。

        该jni属于libandroid_runtime,所有java程序都可以使用。

java

        源代码位于:frameworks/base/core/java/android/hardware。

        Sensor描述一个传感器,Sensor的成员由JNI层在nativeGetNextSensor时填充。

        SensorEvent表示传感器事件。

        SensorEventListener定义传感器事件回调接口。

        SensorEventListener2扩展了SensorEventListener接口,增加onFlushCompleted回调。

        TriggerEvent表示触发类型的传感器事件,相比SensorEvent少了accuracy成员。

        TriggerEventListener定义触发类型的传感器事件回调接口。

        SystemSensorManager管理传感器和用户连接(即Listener、EventQueue)。

        SystemSensorManager的BaseEventQueue类封装JNI的Receiver对象,同时定义了几个抽象回调方法,通过这些回调将事件一个个发给派生类。

        SystemSensorManager的SensorEventQueue继承BaseEventQueue,负责将底层的事件矢量(float[])转换为SensorEvent对象,并检测传感器精度变化,回调SensorEventListener。

        SystemSensorManager的TriggerEventQueue与SensorEventQueue相似,只是事件用TriggerEvent表示,另外事件值触发一次,自动disable。适用于类型为TYPE_SIGNIFICANT_MOTION的传感器。

        使用SystemSensorManager注册事件侦听器时,可以提供一个Handler,其内部Looper用来指定回调处理线程。默认使用主Looper线程。

        SensorListener定义传感器事件回调接口,相比SensorEventListener,回调事件没有时间戳和精度信息,不建议使用。

        LegacySensorManager兼容老的API,用整数句柄表示传感器,事件回调使用SensorListener。

        SensorManager导出新老API接口,其功能分别由SystemSensorManager和LegacySensorManager实现。实际上SystemSensorManager继承SensorManager,而LegacySensorManager使用SensorManager实现老的API。

        有两个地方可能创建SystemSensorManager:

  • ContextImpl.getSystemService

        ContextImpl在static初始化时注册sensor服务,当引用这个服务时延迟创建SystemSensorManager,每个应用进程最多有一个SystemSensorManager对象。应用进程通过libgui与存在于SystemServer进程中的“sensors”服务做跨进程通信。

  • PowerManagerService.systemReady
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Fighting Horse

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

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

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

打赏作者

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

抵扣说明:

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

余额充值