Как отменить регистрацию слушателя от датчика после остановки сервиса? - PullRequest
6 голосов
/ 17 марта 2012

Я создаю приложение, которое запускает службу при нажатии кнопки «Старт» и останавливает ее при нажатии кнопки «Стоп».в сервисе я регистрирую прослушиватель для датчика 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
    }
};

}

Может кто-нибудь, пожалуйста, помогите мне ??

1 Ответ

0 голосов
/ 17 марта 2012

onDestroy() может не вызываться операционной системой вашего приложения сразу. Поместите ваш stopListening() вызов в onPause(), а startListening() в ваши onResume() функции. Таким образом, вы гарантированно зарегистрируете приложение и отмените регистрацию с помощью датчиков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...