2010-12-14 5 views
2

Ich bin auf der Suche nach der besten Praxis, um einen Service für die Aufzeichnung GPS- oder andere Sensor-Werte in regelmäßigen Abständen (alle 10-60 sec) zu implementieren. Der Dienst sollte sich mit dem Standby-Modus befassen, wenn das Telefon einschläft.Android: Service für GPS/Sensor Logging

Jede Hilfe (Pseudocode oder Tutorials) wird sehr geschätzt!

Antwort

3

Es sieht aus wie es unmöglich ist, die Orientierungssensoren lassen auch ständig stundenlang arbeiten, obwohl das Gerät einschlafen kann (siehe http://code.google.com/p/android/issues/detail?id=3708#makechanges

Sobald die Anzeige erlischt, werden die Sensoren gleich tun .. :(.

ich realisiert jetzt eine WakeLock (Bedürfnisse Erlaubnis)

<uses-permission android:name="android.permission.WAKE_LOCK" /> 

in Verbindung mit einem Timer und einem broadcastreciever, der auf die Anzeige wieder zurück schaltet. das ist natürlich verrückt nach Akkulaufzeit, aber bis jetzt habe ich keinen anderen Weg gefunden.

Das ist meine onCreate Methode im Dienst:

@Override 
public void onCreate() { 
mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
CONTEXT = this; 
PowerManager pm = (PowerManager) CONTEXT.getSystemService(Context.POWER_SERVICE); 
this.mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "my tag"); 
mWakeLock.acquire(); 
Log.d(TAG, "Wakelock acquired"); 
// register receiver that handles screen on and screen off logic 
      IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
      filter.addAction(Intent.ACTION_SCREEN_OFF); 
      BroadcastReceiver mReceiver = new ScreenReceiver(); 
      registerReceiver(mReceiver, filter); 
} 

dies die onStart Methode des Dienstes:

@Override 
public void onStart(Intent intent, int startid) { 
Toast.makeText(this, "My Service Started", Toast.LENGTH_SHORT).show(); 
Log.d(TAG, "onStart"); 
boolean screenOn = intent.getBooleanExtra("screen_state", false); 
      if (!screenOn) { 
       Log.d(TAG, "Screen is on"); 
      } else { 
      Log.d(TAG, "Screen is off"); 
     Timer timer = new Timer("DigitalClock"); 
    timer.schedule(new TimerTask() { 
     @Override 
     public void run() { 
     Log.d(TAG,"Waiting 1 sec for switching the screen back on again..."); 
    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
    mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, 
     "my tag"); 
    mWakeLock.acquire(); 
     } 
    }, 1000); 
      mWakeLock.acquire(); 
       } 
} 

und dies ist die BroadcastReceiver Klasse:

public class ScreenReceiver extends BroadcastReceiver { 
    private boolean screenOff; 
    @Override 
    public void onReceive(Context context, Intent intent) { 
      if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
        screenOff = true; 
      } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
        screenOff = false; 
      } 
      Intent i = new Intent(context, MyService.class); 
      i.putExtra("screen_state", screenOff); 
      context.startService(i); 
    } 

}

Diese Problemumgehung funktioniert auch, wenn ein Gerät über USB vom Debugger UN-gesteckt ist (ich hatte zuerst ein Problem damit).

Bitte lassen Sie mich wissen, wenn Sie eine bessere Lösung haben, oder wenn in 2.3 behoben ist. Danke!

+0

Ist es immer noch der einzige Weg? Ich meine, gibt es eine bessere Möglichkeit, Android-Sensoren ständig zu überwachen? – Demiurg

1

Hier ist ein Link zu einem Lernprogramm zur Verwendung von Android Services. LINK Hier ist ein Link zu einem Lernprogramm zum Lesen von Daten von Sensoren. LINK