2015-12-26 16 views
5

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

5

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); 
    } 
} 
+0

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) –

+0

Sì, è il modo corretto, ho modificato la mia risposta per mostrare i dettagli – TheoKanning

+0

@ 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

2

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

  1. creare il codice modificando i modelli a WakefulBroadcastReceiver
  2. aggiungere il servizio e la BroadCastReceiver nel manifesto.
  3. 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

Problemi correlati