Я зарегистрировал прослушиватель, MotionSensors, теперь, когда будет изменен метод изменения движения "onSensorChange()".
Я знаю, что эти вызовы вступают в класс SensorManager.java. Я хочу знать, как эти сенсоры меняют события, поступает из JNI, как JNI trigger change Event и отправляет его в Framework (SensorManager.java).
Если вы знаете, где именно находится код, нетрудно проверить, как это работает. Итак, главная часть здесь:
while (true) {
// wait for an event
final int sensor = sensors_data_poll(sQueue, values, status, timestamp);
int accuracy = status[0];
synchronized (sListeners) {
if (sensor == -1 || sListeners.isEmpty()) {
// we lost the connection to the event stream. this happens
// when the last listener is removed or if there is an error
if (sensor == -1 && !sListeners.isEmpty()) {
// log a warning in case of abnormal termination
Log.e(TAG, "_sensors_data_poll() failed, we bail out: sensors=" + sensor);
}
// we have no more listeners or polling failed, terminate the thread
sensors_destroy_queue(sQueue);
sQueue = 0;
mThread = null;
break;
}
final Sensor sensorObject = sHandleToSensor.get(sensor);
if (sensorObject != null) {
// report the sensor event to all listeners that
// care about it.
final int size = sListeners.size();
for (int i=0 ; i<size ; i++) {
ListenerDelegate listener = sListeners.get(i);
if (listener.hasSensor(sensorObject)) {
// this is asynchronous (okay to call
// with sListeners lock held).
listener.onSensorChangedLocked(sensorObject,
values, timestamp, accuracy);
}
}
}
}
}
//Log.d(TAG, "exiting main sensor thread");
}
Этот код запускается в отдельном потоке SensorThreadRunnable
постоянно (while (true)
). Сначала он вызывает встроенную функцию sensors_data_poll
которая возвращает идентификатор датчика, который изменил его значение (или -1, если таких датчиков нет). Если он возвращает -1, цикл запускается с самого начала. Если значения датчика были изменены, то из идентификатора датчика создан датчик Object (final Sensor sensorObject = sHandleToSensor.get(sensor);
). После этого есть цикл, который проходит по всему зарегистрированному слушателю, и если слушатель прослушивает этот сенсорный объект, он уведомляется о том, что значение датчика было изменено.