public boolean registerListener(SensorEventListener listener, Sensor sensor, int samplingPeriodUs) {
return registerListener(listener, sensor, samplingPeriodUs, null ); } public boolean registerListener(SensorEventListener listener, Sensor sensor, int samplingPeriodUs, Handler handler) {
// SensorManager.SENSOR_DELAY_NORMAL默认采样率 200000us int delay = getDelay(samplingPeriodUs); return registerListenerImpl(listener, sensor, delay, handler, 0 , 0 ); } @Override protected boolean registerListenerImpl(SensorEventListener listener, Sensor sensor, int delayUs, Handler handler, int maxBatchReportLatencyUs, int reservedFlags) {
android.util.SeempLog.record_sensor_rate( 381 , sensor, delayUs); if (listener == null || sensor == null ) {
Log.e(TAG, "sensor or listener is null" ); return false ; } // Trigger Sensors should use the requestTriggerSensor call. // NO2.1如果sensor类型是Sensor.REPORTING_MODE_ONE_SHOT就返回,requestTriggerSensor注册的sensor if (sensor.getReportingMode() == Sensor.REPORTING_MODE_ONE_SHOT) {
Log.e(TAG, "Trigger Sensors should use the requestTriggerSensor." ); return false ; } // Sensor.REPORTING_MODE_ONE_SHOT ,判断时间 if (maxBatchReportLatencyUs < 0 || delayUs < 0 ) {
Log.e(TAG, "maxBatchReportLatencyUs and delayUs should be non-negative" ); return false ; } // 判断Listener数量是否超过超过MAX_LISTENER_COUNT if (mSensorListeners.size() >= MAX_LISTENER_COUNT) {
throw new IllegalStateException( "register failed, " + "the sensor listeners size has exceeded the maximum limit " + MAX_LISTENER_COUNT); } // Invariants to preserve: // - one Looper per SensorEventListener // - one Looper per SensorEventQueue // We map SensorEventListener to a SensorEventQueue, which holds the looper synchronized (mSensorListeners) {
// 从缓存里获取listener SensorEventQueue queue = mSensorListeners.get(listener); if (queue == null ) {
Looper looper = (handler != null ) ? handler.getLooper() : mMainLooper; final String fullClassName = listener.getClass().getEnclosingClass() != null ? listener.getClass().getEnclosingClass().getName() : listener.getClass().getName(); // NO2.2 新建一个SensorEventQueue queue = new SensorEventQueue(listener, looper, this , fullClassName); // NO2.3 添加sennsor if (!queue.addSensor(sensor, delayUs, maxBatchReportLatencyUs)) {
queue.dispose(); return false ; } // 将listener放入缓存 mSensorListeners.put(listener, queue); return true ; } else {
return queue.addSensor(sensor, delayUs, maxBatchReportLatencyUs); } } } |