Sto cercando di implementare l'API del sensore di passo introdotta in Android 4.4 (http://youtu.be/yv9jskPvLUc). Tuttavia, non sono in grado di trovare una spiegazione chiara su quale sia il modo consigliato di monitorare ciò in background? Sembra che la maggior parte degli esempi mostri solo come farlo con un'attività mentre l'app è in esecuzione. Non ho particolarmente bisogno di un'alta frequenza di aggiornamenti: fondamentalmente voglio registrare la quantità di passaggi che l'utente ha percorso ogni ora per un servizio di back-end. Dovrei semplicemente avviare un servizio in background che chiama registerListener su SensorManager, o c'è un modo più elegante?Utilizzo di TYPE_STEP_COUNTER in un servizio in background?
risposta
Per quanto ne so, non v'è alcun modo per aggirare il SensorManager
, ma se avete bisogno i dati molto di rado, si potrebbe innescare il sensore manualmente e ottenere i suoi valori con una TriggerEventListener
, che è un po 'più pulito di un SensorEventListener
.
AlarmManager
è in genere l'opzione migliore per l'avvio di un timer orario e funziona anche se l'app non è in esecuzione. AlarmManager
invia un Intent
a una classe che si estende BroadcastReceiver
e tale classe avvierà il proprio Service
. AlarmManager
può essere impostato in qualsiasi punto dell'app, in base all'implementazione.
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);
}
}
Questo non è un co soluzione completa, ma il modo più efficiente dal punto di vista energetico potrebbe essere quello di riattivare il dispositivo ogni ora o così, avviare un servizio che legge rapidamente i dati, quindi torna a dormire.
A seconda del livello del dispositivo scelto, utilizzando WakefulBroadcastReceiver, come descritto in this answer, sembra la strada da percorrere.
È necessario
- creare il codice modificando i modelli a WakefulBroadcastReceiver
- aggiungere il servizio e la BroadCastReceiver nel manifesto.
- schedule a repeating alarm da qualche parte nella vostra applicazione
Se uno qualsiasi dei punti a meno che chiaro, diciamo così. Vedi http://code.tutsplus.com/tutorials/android-barometer-logger-acquiring-sensor-data--mobile-10558
@ La risposta di TheoKanning è il modo corretto di farlo manualmente. In alternativa, Google Fit registra continuamente questi dati e ha un'API che puoi utilizzare per caricarlo nella tua app.
- 1. Utilizzo di Google Play Services LocationClient nel servizio in background
- 2. - Esecuzione in background dal servizio
- 3. Utilizzo di un worker in background in ASP.NET con AJAX
- 4. Creazione del servizio in background in Android
- 5. Come creare un servizio in background sempre in esecuzione?
- 6. Implementazione di un conto alla rovescia con Servizio in background
- 7. Esecuzione di un comando come processo/servizio in background
- 8. Come eseguire il debug di un servizio in background Android?
- 9. Servizio in background nell'app apache cordova
- 10. come scaricare file con servizio in background?
- 11. Screenshot dal servizio in background di un'altra applicazione (programmaticamente)
- 12. Android: utilizzo della rete in un servizio
- 13. Rilevamento regione dei beacon estimetrici da un servizio in background
- 14. Utilizzo di un wakelock in un servizio Android 1.5
- 15. Utilizzo di Thread.Sleep() in un servizio di Windows
- 16. JavaFX2: Posso mettere in pausa un'operazione/servizio in background?
- 17. Avvio del servizio in background all'accensione di Android
- 18. Apri/Esegui fotocamera dal servizio in background in Android
- 19. Spring Boot: utilizzo di un servizio @Service in Quartz
- 20. Utilizzo della CPU di un servizio specifico in C#
- 21. Servizio di background su Android nativo react
- 22. Android - Esegui in background - Servizio vs. classe Java Standard
- 23. Aggiornamento del database Firebase dal servizio in background
- 24. Esecuzione di WebView in background
- 25. Come eseguire l'intera app Android ionica come servizio in background?
- 26. Come mostrare la notifica dal servizio in background?
- 27. Perché utilizzare il servizio per le attività in background?
- 28. Timer in background
- 29. Come aggiornare le informazioni in un'attività Android da un servizio in background
- 30. Qual è la differenza tra un servizio in background e in primo piano?
Sono perfettamente d'accordo con ottenere i dati di rado. Dove posizioni questo codice? In un ricevitore di allarme attivato periodicamente?(Scusate se sono stupido, non nuovo per lo sviluppo, ma nuovo per Android) –
Sì, è il modo corretto, ho modificato la mia risposta per mostrare i dettagli – TheoKanning
@ TheoKanning Potresti approfondire come il sensore di gradino sarebbe in grado di contare i passi fatti in un periodo di un'ora se 'registerListener()' non è stato chiamato? L'impostazione di un trigger non deve essere applicata solo ai sensori one-shot? – ibe