如何知道我的SensorManager是否有已注册的传感器

时间:2013-01-11 00:48:11

标签: android listener registration sensor sensormanager

我正在为我的Android应用程序使用传感器。我用一行代码注册传感器:

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

我已经引入了一行代码来取消注册侦听器,因此它不会一直运行:

mySensorManager.unregisterListener(this);

到目前为止它可以工作,但我需要在应用程序恢复时再次注册它。我需要知道我的sensorManager是否有一个注册的监听器,所以我可以再次注册或skit它。这样的事情可以做到吗?:

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

2 个答案:

答案 0 :(得分:6)

据我所知,没有本地方法可以检查您是否已经注册了监听器。我不会太担心这个检查,因为这个检查已经由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,只会添加一次:)

同样适用于取消注册逻辑

答案 1 :(得分:0)

@addition to Pavel:  SensorEventListeners可以多次注册。见hereJava Programming for Android Developers。我确实注册了9个传感器,其监听器延迟为SENSOR_DELAY_GAME,而run()则为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()中放入大量事件,这就是为什么你应该使用谷歌advice来阻止这种方法更严重:

  

传感器数据可能会以很高的速率发生变化,这意味着系统可能会经常调用onSensorChanged(SensorEvent)方法。作为最佳实践,您应该在onSensorChanged(SensorEvent)方法中尽可能少地执行此操作,这样您就不会阻止它。如果您的应用程序要求您进行任何数据过滤或减少传感器数据,您应该在onSensorChanged(SensorEvent)方法之外执行该工作。