Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何知道我的SensorManager是否有已注册的传感器_Android_Listener_Registration_Sensors_Sensormanager - Fatal编程技术网

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

Android 如何知道我的SensorManager是否有已注册的传感器,android,listener,registration,sensors,sensormanager,Android,Listener,Registration,Sensors,Sensormanager,我正在为我的Android应用程序使用传感器。我用一行代码注册传感器: mySensorManager.registerListener(this, orientationSensor, SensorManager.SENSOR_DELAY_NORMAL); 我引入了一行代码来注销侦听器,这样它就不会一直运行: mySensorManager.unregisterListener(this); 到目前为止,它的工作,但我需要再次注册时,应用程序恢复。我需要知道我的sensorManager是

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

mySensorManager.registerListener(this, orientationSensor, SensorManager.SENSOR_DELAY_NORMAL);
我引入了一行代码来注销侦听器,这样它就不会一直运行:

mySensorManager.unregisterListener(this);
到目前为止,它的工作,但我需要再次注册时,应用程序恢复。我需要知道我的sensorManager是否有注册的侦听器,以便我可以再次注册或跳过它。这样的事情可以做到吗

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

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

这同样适用于取消注册的逻辑

@添加到Pavel:
SensorEventListeners
可以多次注册。被看见和进入。我确实注册了9个监听延迟为
SENSOR\u delay\u GAME
的传感器,并使用
THREAD\u PRIORITY\u BACKGROUND
运行()。它很好用。要取消注册,我在
私有类readoutRunnable实现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);                
        }
    }
这会在sensorchange()中放入大量事件,这就是为什么您应该让谷歌不要更严重地阻止该方法的原因:

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


听起来您只是想在
onResume()
中注册侦听器,然后在
onPause()中注销它。这行得通吗?是的,这就是我想做的。最理想的情况是在尝试两次注册之前询问是否有已注册的侦听器正在运行,但如果在
onPause()
中注销该侦听器,则不必检查它是否已注册。感谢Pavel提供此有用信息。“检查已经由Android完成,因此如果您已经注册了侦听器,Android不会添加同一个侦听器两次”