一个简单的注册流程图:
--调用registerListener()函数,实际调用抽象函数registerListenerImpl
--子类SystemSensorManager实现了registerListenerImpl
--如果有sensor事件,则JNI层android_hardware_SensorManager.cpp就调用dispatchSensorEvent()方法发送
--onSensorChanged()处理事件
SensorManager是一个抽象类,应用程序使用/监听Sensor都通过它。
public abstract class SensorManager {//抽象类
/** @hide */
protected static final String TAG = "SensorManager";
...
}
它定义了一些主要的方法,给应用层使用,提供了什么接口?
public boolean registerListener(SensorEventListener listener, Sensor sensor,//提供接口,给应用层注册监听器
int samplingPeriodUs, Handler handler) {
int delay = getDelay(samplingPeriodUs);
return registerListenerImpl(listener, sensor, delay, handler, 0, 0);
}
public void unregisterListener(SensorEventListener listener) {//提供接口,给应用层卸载监听器
if (listener == null) {
return;
}
unregisterListenerImpl(listener, null);
}
注册/听器函数registerListener(SensorEventListener,Sensor,int,int)
SensorEventListener是监听器对象,负责接收和处理SensorEvent的事件。Sensor是要监听的sensor,如TYPE_PROXIMITY类型的.
如果Sensor有数据上报,那么SensorEventListener监听器对象就会收到消息,里面的onSensorChanged()函数就负责处理。
public boolean requestTriggerSensor(TriggerEventListener listener, Sensor sensor) {//注册one-shot trigger类sensor
return requestTriggerSensorImpl(listener, sensor);
}
public boolean cancelTriggerSensor(TriggerEventListener listener, Sensor sensor) {
return cancelTriggerSensorImpl(listener, sensor, true);
}
r
equestTriggerSensor/cancelTriggerSensor与上面的registerListener/unregisterListener一样注册/卸载监听器用的,
只不过,监听器收到事件后就自动disable,如果要继续监听,就要在事件处理函数里再次调用requestTriggerSensor。
//抽象方法,由子类实现
protected abstract boolean registerListenerImpl(SensorEventListener listener, Sensor sensor,
int delayUs, Handler handler, int maxReportLatencyUs, int reservedFlags);
protected abstract void unregisterListenerImpl(SensorEventListener listener, Sensor sensor);
protected abstract boolean requestTriggerSensorImpl(TriggerEventListener listener,
Sensor sensor);
protected abstract boolean cancelTriggerSensorI