MotionSensorsにリスナーを登録しました。これで、モーション変更メソッド「onSensorChange()」が呼び出されます。
私はこれらの呼び出しがSensorManager.javaクラスから開始することを知っています。これらのセンサー変更イベントがJNIからどのように発生するか、JNIが変更イベントをトリガーしてFramework(SensorManager.java)に送信する方法を知りたいです。
MotionSensorsにリスナーを登録しました。これで、モーション変更メソッド「onSensorChange()」が呼び出されます。
私はこれらの呼び出しがSensorManager.javaクラスから開始することを知っています。これらのセンサー変更イベントがJNIからどのように発生するか、JNIが変更イベントをトリガーして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が返される場合、サイクルは最初から開始されます。センサー値が変更されている場合は、センサー識別子からsensorObject(final Sensor sensorObject = sHandleToSensor.get(sensor);
)が作成されます。その後、登録されているすべてのリスナーにまたがるサイクルがあり、リスナーがこのセンサーオブジェクトをリッスンすると、センサーの値が変更されたことが通知されます。