2016-07-12 10 views
2

Ich versuche, einen Dienst für eine Android-App zu schreiben, die bei einer festen Abtastrate kontinuierlich die Beschleunigungssensorwerte überwacht. Im Folgenden finden Sie einen Ausschnitt des Codes, mit dem ich den Dienst am Laufen halte.Android Service Logging Sensordaten ununterbrochen

public class MyService extends Service { 
    ... 
    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     super.onStartCommand(intent, flags, startId); 
     Intent mainIntent = new Intent(this, MainActivity.class); 
     TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); 
     stackBuilder.addParentStack(MainActivity.class); 
     stackBuilder.addNextIntent(mainIntent); 
     PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 
     Notification notification = new Notification.Builder(this) 
      .setSmallIcon(R.mipmap.ic_launcher) 
      .setContentTitle(getString(R.string.app_name)) 
      .setAutoCancel(true) 
      .setOngoing(true) 
      .setContentIntent(pendingIntent) 
      .setContentText(TAG) 
      .build(); 
     context.startForeground(1, notification); 
     PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE); 
     PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag"); 
     wakeLock.acquire(); 
     //Register Accelerometer Sensor Listener Here 
     return START_STICKY; 
} 

Wenn das Gerät nach einigen Minuten mit Batterien läuft, geht es schlafen. Der Dienst wird sporadisch, aber ohne Konsistenz neu gestartet. Die Ideen, die ich jetzt in Betracht ziehen:

Aber ich wünschte, es wäre nicht notwendig. Kennt jemand eine Möglichkeit, diese Sensorprotokollierungsfunktion immer auszuführen?

-

Ich habe auch versucht, für einen einfachen, den Sensor Hörer ändert Thread bei Wiederholung nur der Sensor die einen schlafen gehen, aber die Wirkung war die gleiche. Ich glaube, es ist nur im Zusammenhang mit Energie-Management von Android

Ich bin mir der Auswirkungen auf die Energieeffizienz dieser bekannt, aber es ist notwendig für diese Anwendung zu garantieren, dass die Protokollierung ist ununterbrochen und mit hoher Abtastrate.

EDITED: Changed Titel

UPDATE zu klären: es zu einem persistent system application Konvertieren hilft nicht

+0

Es gibt nicht so etwas wie eine unkillable Service, ein Benutzer kann es immer komplett heruntergefahren, wenn er will –

+0

es keinen Dienst sein muss, ist dies Teil einer Forschungsprojekt und ich brauche es nur, um die Sensordaten jederzeit auf meinem Gerät zu protokollieren. Wenn es ein anderes Element als einen Dienst gibt, der das erreicht, würde ich es verwenden, aber ich bin mir einer solchen Sache nicht bewusst. Es ist in Ordnung, wenn der Benutzer es tötet, aber ich will nur nicht, dass das Betriebssystem es tötet – apidae

+0

Das Betriebssystem * wird schließlich alle Ihre App-Komponenten töten. Das Beste, was Sie tun können, ist einen Neustart nach, wie Sie es mit START_STICKY tun. Ich kenne keinen besseren Weg als einen klebrigen Service. –

Antwort

0

ich in der Lage war, diese zu lösen. Eigentlich war es ein Fehler im Code. Der WakeLock in dem Snippet, das ich gepostet habe, ist eine lokale Variable und wird bei der Rückgabe der Funktion mit Garbage Collection gesammelt, sodass es keine Sperre gab. Ich kann es fixiert dies durch eine Änderung:

public class MyService extends Service { 
    private PowerManager powerManager; 
    private static PowerManager.WakeLock wakeLock; 
    ... 
    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     ... 
     powerManager = (PowerManager) getSystemService(POWER_SERVICE); 
     wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag"); 
     wakeLock.acquire(); 
     ... 
}