2012-03-17 83 views
5

我正在創建一個應用程序,在按下「開始」按鈕時啓動服務,並在按下「停止」按鈕時停止它。在服務中,我註冊了傳感器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 
    } 
}; 

}

任何人都可以請幫我?

+0

該服務可能需要由您的應用程序停止 – zapl 2012-03-17 14:32:48

+0

它正在被我的應用程序停止。我的應用程序的主要活動通過調用stopService()方法來停止服務。 – Nikunj 2012-03-18 13:31:31

+0

可以看到這個問題很老。你找到了解決方案嗎? :) – 2015-05-28 09:06:00

回答

0

onDestroy()可能不會被您的應用程序中的操作系統直接調用。將您的stopListening()呼叫撥入您的onResume()功能中的onPause()startListening()。通過這種方式,您可以確保應用程序註冊並使用傳感器取消註冊。

+3

因爲我使用的是一個服務而不是這個java文件的活動,所以我不能實現onResume()和onPause()方法。你能建議我任何其他選擇嗎? – Nikunj 2012-03-18 13:31:07