2012-03-17 11 views
5

Estoy creando una aplicación que inicia un servicio cuando se presiona el botón "Comenzar" y se detiene cuando se presiona el botón "Parar". en el servicio, registro un oyente para el sensor ACCELEROMETER para que obtenga los valores de acelerómetro de los ejes x, y, z ... pero cuando detengo mi aplicación y elimino el registro del oyente del sensor, incluso entonces obtengo los valores de mi acelerómetro.¿Cómo anular el registro de un oyente de un sensor después de detener el servicio?

Aquí está el código:

// 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 
    } 
}; 

}

Puede alguien por favor me ayude a cabo ??

+0

Ese servicio puede necesitar ser detenido por su aplicación – zapl

+0

que está siendo detenido por mi aplicación. La actividad principal de mi aplicación detiene el servicio llamando al método stopService(). – Nikunj

+0

puede ver que esta pregunta es antigua. ¿Encontraste una solución? :) –

Respuesta

0

onDestroy() no puede ser llamado por el sistema operativo en su aplicación de inmediato. Coloque su llamada stopListening() en onPause(), y startListening() en sus funciones onResume(). De esta forma, se garantiza que la aplicación se registre y se anule el registro con los sensores.

+3

Como uso un servicio y no una actividad para este archivo java, no puedo implementar los métodos onResume() y onPause(). puedes sugerirme otra opción? – Nikunj

Cuestiones relacionadas