Как узнать, если мой SensorManager имеет зарегистрированный датчик

Я использую датчик для моего приложения Android. Я регистрирую датчик с помощью строки кода:

mySensorManager.registerListener(this, orientationSensor, SensorManager.SENSOR_DELAY_NORMAL);

Я ввел строку кода для отмены регистрации слушателя, чтобы он не работал постоянно:

mySensorManager.unregisterListener(this);

Пока это работает, но мне нужно зарегистрировать его снова, когда приложение возобновит работу. Мне нужно знать, есть ли у моего sensorManager зарегистрированный слушатель, чтобы я мог зарегистрироваться снова или пропустить его. Может ли что-то подобное быть сделано?

if (mySensorManager.getRegisteredListenerList == null){ registerListener() } else { .. }

2 ответа

Решение

Насколько я знаю, нет родного способа проверить, если вы уже зарегистрировали слушателя. Я бы не стал сильно беспокоиться об этой проверке, поскольку эта проверка уже выполнена Android, поэтому, если вы уже зарегистрировали прослушиватель, Android не собирается добавлять одного и того же прослушивателя дважды:

@SuppressWarnings("deprecation")
private boolean registerLegacyListener(int legacyType, int type,
        SensorListener listener, int sensors, int rate)
    {
        if (listener == null) {
            return false;
        }
        boolean result = false;
        // Are we activating this legacy sensor?
        if ((sensors & legacyType) != 0) {
            // if so, find a suitable Sensor
            Sensor sensor = getDefaultSensor(type);
            if (sensor != null) {
                // If we don't already have one, create a LegacyListener
                // to wrap this listener and process the events as
                // they are expected by legacy apps.
                LegacyListener legacyListener = null;
                synchronized (mLegacyListenersMap) {
                    legacyListener = mLegacyListenersMap.get(listener);
                    if (legacyListener == null) {
                        // we didn't find a LegacyListener for this client,
                        // create one, and put it in our list.
                        legacyListener = new LegacyListener(listener);
                        mLegacyListenersMap.put(listener, legacyListener);
                    }
                }
                // register this legacy sensor with this legacy listener
                legacyListener.registerSensor(legacyType);
                // and finally, register the legacy listener with the new apis
                result = registerListener(legacyListener, sensor, rate);
            }
        }
        return result;
    }

Таким образом, вы можете вызывать registerListener столько раз, сколько захотите, он будет добавлен только один раз:)

То же самое относится и к незарегистрированной логике

@ дополнение к Павлу: SensorEventListeners могут быть зарегистрированы несколько раз. Видно здесь и в Java-программировании для разработчиков Android. Я зарегистрировал 9 датчиков с задержкой на прослушивание SENSOR_DELAY_GAME и запустить () с THREAD_PRIORITY_BACKGROUND, Работает нормально. Чтобы отменить регистрацию, я сделал следующее в private class readoutRunnable implements Runnable:

@Override
    public void run() {
        try { 
              //process events from locally stored SensorEvent[]
              // array is filled from onSensorChanged()
        } catch (Exception e) {
            // catch e
        } finally {
            sensorManager.unregisterListener(listener);                
        }
    }

Это ставит много событий в onsensorchanged() Вот почему вы должны принять совет Google, чтобы не блокировать метод тем более серьезным:

Данные датчика могут изменяться с высокой скоростью, что означает, что система может вызывать метод onSensorChanged(SensorEvent) довольно часто. Рекомендуется делать как можно меньше в методе onSensorChanged(SensorEvent), чтобы не блокировать его. Если ваше приложение требует от вас какой-либо фильтрации данных или сокращения данных датчика, вы должны выполнить эту работу вне метода onSensorChanged(SensorEvent).

Другие вопросы по тегам