一、
首先获取SystemSensorManager,并强制转换成父类SensorManager来使用
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
二、
之后通过getDefaultSensor,利用钩子函数,从SystemSensorManager的ArrayList<Sensor> sFullSensorsList = new ArrayList<Sensor>();中获取到指定类型的传感器对象
gyroscopeSensor = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
三、
注册监听:
sensorManager.registerListener(this, gyroscopeSensor,SensorManager.SENSOR_DELAY_NORMAL);
registerListener最后会调用到(SensorManager.java)
public boolean registerListener(SensorEventListener listener, Sensor sensor, int rate) {
return registerListener(listener, sensor, rate, null);
}
这会调用到钩子:registerListenerImpl
public boolean registerListener(SensorEventListener listener, Sensor sensor, int rate,
Handler handler) {
if (listener == null || sensor == null) {
return false;
}
int delay = -1;
switch (rate) {
case SENSOR_DELAY_FASTEST:
delay = 0;
break;
case SENSOR_DELAY_GAME:
delay = 20000;
break;
case SENSOR_DELAY_UI:
delay = 66667;
break;
case SENSOR_DELAY_NORMAL:
delay = 200000;
break;
default:
delay = rate;
break;
}
return registerListenerImpl(listener, sensor, delay, handler);
}
/** @hide */
protected abstract boolean registerListenerImpl(SensorEventListener listener, Sensor sensor,
int delay, Handler handler);
显然,其实现是在SystemSensorManager中:
/** @hide */
@Override
protected boolean registerListenerImpl(SensorEventListener listener, Sensor sensor,
int delay, Handler handler)
{
// Invariants to preserve:
// - one Looper per SensorEventListener
// - one Looper per SensorEventQueue
// We map SensorEventListener to a SensorEventQueue, which holds the looper
if (sensor == null) throw new IllegalArgumentException("sensor cannot be null");
// Trigger Sensors should use the requestTriggerSensor call.
if (Sensor.getReportingMode(sensor) == Sensor.REPORTING_MODE_ONE_SHOT) return false;
synchronized (mSensorListeners) {
SensorEventQueue queue = mSensorListeners.get(listener);
if (queue == null) {
Looper looper = (handler != null) ? handler.getLooper() : mMainLooper;
queue = new SensorEventQueue(listener, looper, this);
if (!queue.addSensor(sensor, delay)) {
queue.dispose();
return false;
}
mSensorListeners.put(listener, queue);
return true;
} else {
return queue.addSensor(sensor, delay);
}
}
}
这里只是查看是否已经注册了监听,如果没有就创建一个监听加入到监听列表mSensorListeners中
// Listener list
private final HashMap<SensorEventListener, SensorEventQueue> mSensorListeners =
new HashMap<SensorEventListener, SensorEventQueue>();
那么SystemSensorManager中的监听是怎么被触发的呢?
在android_hardware_SensorManager.cpp中会继承LooperCallback的handEvent接口,因此每次有事件到达时,就会触发handlerEvent。
virtual int handleEvent(int fd, int events, void* data) {
JNIEnv* env = AndroidRuntime::getJNIEnv();
sp<SensorEventQueue> q = reinterpret_cast<SensorEventQueue *>(data);
ssize_t n;
ASensorEvent buffer[16];
while ((n = q->read(buffer, 16)) > 0) {
for (int i=0 ; i<n ; i++) {
env->SetFloatArrayRegion(mScratch, 0, 16, buffer[i].data);
env->CallVoidMethod(mReceiverObject,
gBaseEventQueueClassInfo.dispatchSensorEvent,
buffer[i].sensor,
mScratch,
buffer[i].vector.status,
buffer[i].timestamp);
if (env->ExceptionCheck()) {
ALOGE("Exception dispatching input event.");
return 1;
}
}
}
if (n<0 && n != -EAGAIN) {
// FIXME: error receiving events, what to do in this case?
}
return 1;
}
};
handEvent再通过jni调用java层的SensorEventQueue->dispatchSensorEvent。SensorEventQueue->dispatchSensorEvent最终调用mListener.onSensorChanged(t);
(这里android_hardware_SensorManager.cpp和SystemSensorManager中很多函数都是对应的jni回调)