【问题标题】:How to unregister a listener from a sensor after stopping the service?停止服务后如何从传感器注销监听器?
【发布时间】:2012-03-17 14:27:50
【问题描述】:

我正在创建一个应用程序,该应用程序在按下“开始”按钮时启动服务,并在按下“停止”按钮时停止服务。在服务中,我为传感器 ACCELEROMETER 注册了一个侦听器,以便获得 x、y、z 轴的加速度计值。但是当我停止我的应用程序并从传感器注销侦听器时,即使这样我也得到了我的加速度计值。

代码如下:

// Service
public class Accel extends Service
{
    private static Context CONTEXT; 
    private static Sensor sensor;
    private static SensorManager sensorManager;
    private static boolean running = false;

    @Override
    public void onCreate()
    {
    }

    // code to execute when the service is shutting down
    @Override
    public void onDestroy()
    {
        if (isListening())
            stopListening();
    }

    // code to execute when the service is starting up 
    @Override
    public void onStart(Intent intent, int startid)
    {
        CONTEXT = this;
        startListening(this);
    }

    public static Context getContext()
    {
        return CONTEXT;
    }

    // Returns true if the manager is listening to orientation changes
    public static boolean isListening()
    {
        return running;
    }

    //Unregisters listeners
    public static void stopListening()
    {
        running = false;
        sensorManager.unregisterListener(sensorEventListener, sensor);
    }

    /**
     * Registers a listener and start listening
     * @param accelerometerListener
     *             callback for accelerometer events
     */
    public static void startListening(AccelerometerListener accelerometerListener)
    {
        sensorManager = (SensorManager) getContext().getSystemService(Context.SENSOR_SERVICE);
        List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER);
        if (sensors.size() > 0)
        {
            sensor = sensors.get(0);
            running = sensorManager.registerListener(sensorEventListener, sensor, SensorManager.SENSOR_DELAY_GAME);
            listener = accelerometerListener;
        }
    }

    /**
     * The listener that listen to events from the accelerometer listener
     */
    private static SensorEventListener sensorEventListener = 
    new SensorEventListener()
    {
    public void onAccuracyChanged(Sensor sensor, int accuracy) {}
    public void onSensorChanged(SensorEvent event)
    {
                // the code to perform on sensor change
    }
};

}

谁能帮帮我?

【问题讨论】:

  • 您的应用可能需要停止该服务
  • 我的应用程序正在停止它。我的应用程序的主要活动通过调用 stopService() 方法停止服务。
  • 可以看出这个问题很老了。你找到解决方案了吗? :)

标签: android android-sensors


【解决方案1】:

onDestroy() 可能不会立即被您应用上的操作系统调用。将您的stopListening() 调用放入onPause(),并将startListening() 放入您的onResume() 函数中。这样,您就可以保证应用在传感器上注册和取消注册。

【讨论】:

  • 由于我使用的是服务而不是此 java 文件的活动,因此我无法实现 onResume() 和 onPause() 方法。你能建议我任何其他选择吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
  • 2012-11-05
  • 1970-01-01
  • 1970-01-01
  • 2019-12-16
相关资源
最近更新 更多