2015-12-26 5 views
5

Ich bin auf die Implementierung der Schrittsensor-API in Android 4.4 eingeführt (http://youtu.be/yv9jskPvLUc). Ich kann jedoch keine klare Erklärung dafür finden, wie die Überwachung im Hintergrund zu empfehlen ist. Es scheint, als würden die meisten Beispiele nur zeigen, wie dies während der Ausführung der App mit einer Aktivität durchgeführt wird. Ich brauche nicht besonders viele Updates - ich möchte im Prinzip die Anzahl der Schritte protokollieren, die der Benutzer jede Stunde zu einem Back-End-Dienst gegangen ist. Sollte ich nur einen Hintergrund-Dienst hochfahren, der registerListener auf SensorManager aufruft, oder gibt es einen eleganteren Weg?Verwendung von TYPE_STEP_COUNTER in einem Hintergrunddienst?

Antwort

5

Soweit ich weiß, gibt es keine Möglichkeit, um die SensorManager, aber wenn Sie die Daten benötigen sehr selten, können Sie den Sensor manuell auslösen und seine Werte mit einem TriggerEventListener bekommen, die ein wenig sauberer als ein SensorEventListener ist.

AlarmManager ist normalerweise die beste Option zum Starten eines stündlichen Timers, und es funktioniert auch, wenn Ihre App nicht ausgeführt wird. AlarmManager sendet eine Intent an eine Klasse, die BroadcastReceiver erweitert, und diese Klasse wird Ihre Service starten. Die AlarmManager kann abhängig von Ihrer Implementierung an beliebiger Stelle in Ihrer App festgelegt werden.

StepCountService

SensorManager sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); 
Sensor stepCounter = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER); 
sensorManager.requestTriggerSensor(listener, stepCounter); 

private TriggerEventListener listener = new TriggerEventListener(){ 
    @Override 
    public void onTrigger(TriggerEvent event) { 
     //handle step count here 
    } 
} 

MainActivity

AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
Intent i = new Intent(context, AlarmReceiver.class); 
PendingIntent pending = PendingIntent.getBroadcast(context, 0, i, 
    PendingIntent.FLAG_CANCEL_CURRENT); 
alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME,AlarmManager.INTERVAL_HOUR, 
    AlarmManager.INTERVAL_HOUR, alarmIntent); 

AlarmReceiver

public class AlarmReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
    Intent service = new Intent(context, StepCountService.class); 
    context.startService(service); 
    } 
} 
+0

Ich bin vollkommen in Ordnung mit selten die Daten zu bekommen. Wo würdest du diesen Code platzieren? In einem Alarmempfänger ausgelöst regelmäßig?(Sorry, wenn ich doof bin, nicht neu in der Entwicklung, aber neu für Android) –

+0

Ja, das ist der richtige Weg, ich habe meine Antwort bearbeitet, um die Details anzuzeigen – TheoKanning

+0

@TheoKanning Könnten Sie näher erläutern, wie der Schrittsensor zählen könnte die Schritte in einer Stunde, wenn 'registerListener()' nicht aufgerufen wurde? Soll ein Trigger nicht nur auf One-Shot-Sensoren angewendet werden? – ibe

2

Dies ist kein Co Komplettlösung, aber der energieeffizienteste Weg könnte sein, Ihr Gerät jede Stunde oder so zu wecken, einen Dienst zu starten, der die Daten schnell liest und dann wieder einschläft.

Je nachdem, welche Geräteebene Sie anvisieren, scheint ein WakefulBroadcastReceiver, wie in this answer beschrieben, der Weg zu gehen.

Sie müssen

  1. den Code erstellen, indem Sie die Vorlagen auf WakefulBroadcastReceiver
  2. Modifizieren der Service und die BroadCastReceiver in das Manifest hinzufügen.
  3. schedule a repeating alarm irgendwo in Ihrer App

Wenn einer der Punkte weniger als klar, sagen Sie es. Siehe http://code.tutsplus.com/tutorials/android-barometer-logger-acquiring-sensor-data--mobile-10558