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