Cosas que pude hacer:
sensorManager = getSystemService(SENSOR_SERVICE) as SensorManager val accelerometerSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) sensorManager.registerListener( accSensor, accelerometerSensor, SensorManager.SENSOR_DELAY_NORMAL ) serviceIntent = Intent(context, SensorService::class.java) context.startForegroundService(serviceIntent)Pero no pude:
¿Cuál podría ser la forma de recibir las notificaciones/devolución de llamada de inicio y fin de movimiento del sistema para que podamos decidir iniciar/finalizar los servicios en primer plano?
Demasiado grande para un comentario, así que lo publicaré como respuesta. Y es en cierto modo una respuesta, pero sin pruebas, solo mi experiencia.
No soy de ninguna manera un experto en Android. Pero sé un par de cosas sobre los sensores en general. Y lo principal es que siempre están activos (por no decir apagados del todo), y que siempre hay algo de ruido . Asi que
moving starts de moving stops .Por lo tanto, piense en la estrategia de agregación y los umbrales, no muestre notificaciones si no se superan los umbrales y haga que su código sea rápido (para que no use demasiada energía). Y ya está... más o menos... porque estas decisiones no son fáciles de tomar. Muchas aplicaciones de grandes empresas no logran hacerlo bien en todos los casos. Simplemente instale un par de aplicaciones de podómetro y verá que todas mostrarán diferentes conteos de pasos.
Los umbrales de lo que es 'movimiento' dependen de su aplicación, por lo que no hay muchas opciones preparadas (por ejemplo, ¿le importa si el usuario sacude su teléfono o simplemente si se mueve en un automóvil por algunas calles?).
Hay tipos de sensores que detectan el inicio/parada del movimiento. Ver aquí Si son buenos o no para su aplicación depende de su aplicación.
TYPE_STATIONARY_DETECT un evento cuando el usuario no se ha movido durante 5 segundos. Escúchelo y utilícelo para detener su servicio. Si quieres más rápido que eso, tendrás que hacerlo tú mismo.
TYPE_MOVEMENT_DETECT es lo opuesto a detección estacionaria y se activa cuando el usuario se ha estado moviendo durante 5 segundos. Puede escuchar esto para iniciar el servicio nuevamente si la latencia de 5 segundos no es un factor decisivo.
El tipo SIGNIFICANT_MOTION también se puede usar si desea que su movimiento active la aplicación del modo de suspensión, pero nunca he tenido mucha suerte para encontrar lo que cuenta como "significativo" para ese tipo de sensor.
Si su movimiento no es una de esas dos cosas, un movimiento sostenido de 5 segundos o lo que sea que active la bandera 'significativa', entonces deberá implementar el inicio y la parada usted mismo, porque un sensor no puede detectar qué movimiento para comenzar si aún no ha comenzado y detectar movimiento . Por ejemplo, he usado algo como este pseudocódigo
class MotionSensorMediator: enum state=[waiting, active] def ctor(): state = waiting def onSensorEvent(SensorEvent event): switch state: case waiting: checkMovementThreshold(event) break case active: checkMovementThreshold(event) sendToListener(event) break def checkMovementThreshold(SensorEvent event): results = //some distance calculations if result > threshold && state == waiting: state = active else if result < threshold && state == active: state = waiting