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
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);
}
}
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
- den Code erstellen, indem Sie die Vorlagen auf WakefulBroadcastReceiver
- Modifizieren der Service und die BroadCastReceiver in das Manifest hinzufügen.
- 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
@ Die Antwort von TheoKanning ist der richtige Weg, dies manuell zu tun. Alternativ protokolliert Google Fit diese Daten kontinuierlich und verfügt über eine API, die Sie verwenden können, um sie in Ihre App zu übernehmen.
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) –
Ja, das ist der richtige Weg, ich habe meine Antwort bearbeitet, um die Details anzuzeigen – TheoKanning
@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