如何在停止服务后注销传感器的监听器?

6
我正在创建一个应用程序,当“启动”按钮被按下时会启动服务,并在“停止”按钮被按下时停止服务。在服务中,我注册了一个传感器加速计的监听器,以便获得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
    }
};

你好,我能帮助你吗?

有人可以帮我吗?


该服务可能需要由您的应用程序停止。 - zapl
我的应用正在停止它。我的应用的主活动通过调用stopService()方法来停止服务。 - Nikunj
你可以看到这个问题是很旧的了。你找到解决办法了吗? :) - Dennis Anderson
1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
0

onDestroy() 可能不会立即被操作系统调用。将 stopListening() 调用放入 onPause() 中,将 startListening() 放入 onResume() 函数中。这样可以确保应用程序在传感器上注册和注销。


3
因为我在这个Java文件中使用的是服务而不是活动,所以无法实现onResume()和onPause()方法。你能否给我建议其他选项? - Nikunj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,