| 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); } } } |