2010-10-13 31 views
0

嗨,這裏有一個有趣的問題!屏幕是黑色時讀取傳感器

我有這樣的服務:

public class SensorService extends Service implements SensorEventListener { 
private static final String TAG = "MyService"; 
private MyServiceBinder myServiceBinder = new MyServiceBinder(); 
private SensorManager mSensorManager; 
      ........... 
private PowerManager.WakeLock wl; 
private Handler mPeriodicEventHandler; //Per interrompere la trasformata a tempo 
private int PERIODIC_EVENT_TIMEOUT = 5000; 
private int x=0,mediacount=0; 

@Override 
public IBinder onBind(Intent intent) { 
    return myServiceBinder; // object of the class that implements Service interface. 
} 
public class MyServiceBinder extends Binder implements IMyService { 
    public void set(String tr, int cp, int sd) { 
     ...... 
    } 
} 
@Override 
public void onCreate() { 
    Log.d(TAG, "onCreate"); 

    // Get the Wake Lock 
    PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE); 
    wl = pm.newWakeLock(
      PowerManager.PARTIAL_WAKE_LOCK, 
      "wlTag"); 
    wl.acquire(); 

    // Get the SensorManager 
    mSensorManager= (SensorManager) getSystemService(SENSOR_SERVICE); 
     mSensorManager.registerListener(this, 
      mSensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER).get(0), 
      sDelay); 

     recc = new recClass(this); 
    recc.open(); 

    // To execute every PERIODIC_EVENT_TIMEOUT seconds 
    mPeriodicEventHandler = new Handler(); 
    mPeriodicEventHandler.postDelayed(doPeriodicTask, PERIODIC_EVENT_TIMEOUT); 
} 

@Override 
public void onDestroy() { 
    Log.d(TAG, "onDestroy"); 
    mIsStarted = false; 
    mPeriodicEventHandler.removeCallbacks(doPeriodicTask); 
    recc.close(); 
    wl.release(); 
} 

@Override 
public void onSensorChanged(SensorEvent event) { // SensorEventListener 
    Sensor sens = event.sensor; 
    if ((sens.getType() == Sensor.TYPE_ACCELEROMETER) && mIsStarted){ 
      fft.add((float)Math.sqrt((event.values[0]*event.values[0])+(event.values[1]*event.values[1])+(event.values[2]*event.values[2]))); // Add value to the fft 
      dataBuffer = fft.calculate(); 
      if (dataBuffer != null){ 
       for (int i=0; i<(fft.camp/2);i++) 
         recc.addValue(toRec, dataBuffer[i]); 
       x++; 
       Toast.makeText(this, "FFT: "+x, Toast.LENGTH_SHORT).show(); 
       mIsStarted = false; 
       // mIsStarted will be true again after PERIODIC_EVENT_TIMEOUT milliseconds 
       mPeriodicEventHandler.postDelayed(doPeriodicTask, PERIODIC_EVENT_TIMEOUT); 
      } 
    } 
} 

@Override 
public void onAccuracyChanged(Sensor sensor, int accuracy) { 
} 
private Runnable doPeriodicTask = new Runnable() 
{ 
    public void run() 
    { 
     mIsStarted = true; 
    } 
}; 

}

怎麼可以看到,我收到了PARTIAL_WAKE_LOCK,我採取的是由x變量多少FFT改造中做計數。

所以開始服務後,我把黑色的屏幕按下紅色的電話按鈕,過了一會兒,我試着看看它做了多少個FFT,但是x的最後一個值與我變黑時的相同屏幕。

經過一些實驗後,我發現如果我嘗試PARTIAL_WAKE_LOCK,而沒有從onSensorChanged方法傳遞它運行良好,但它似乎是當屏幕變黑時,除傳感器偵聽器外,繼續運行。我該如何修復?

TNKS

瓦萊里奧

回答