I have created a step counter service to log step counts periodically using firebase job dispatcher. The sensor event is working when my app is running and logs the step count and it is not logging when the app is closed.
How to listen for a sensor event in background service?
class MyJobService : JobService(), SensorEventListener {
val TAG = "MyJobService"
var sensorManager: SensorManager? = null
var stepsSensor: Sensor? = null
override fun onStartJob(job: JobParameters): Boolean {
sensorManager = applicationContext.getSystemService(Context.SENSOR_SERVICE) as SensorManager
stepsSensor = sensorManager!!.getDefaultSensor(Sensor.TYPE_STEP_COUNTER)
if (stepsSensor != null) {
sensorManager!!.registerListener(this, stepsSensor, SensorManager.SENSOR_DELAY_FASTEST)
} else {
Log.e(TAG, "sensor not available")
}
return true // wait for sensor event
}
override fun onAccuracyChanged(theSensor: Sensor?, accuracy: Int) {
}
override fun onSensorChanged(event: SensorEvent?) {
val latestSensorCount = event!!.values[0].toLong()
Log.e(TAG, "Steps count $latestSensorCount") // works when App / activity is running
}
override fun onStopJob(job: JobParameters): Boolean {
return false
}
}
Starting service from mainactivity from activity by
val dispatcher = FirebaseJobDispatcher(GooglePlayDriver(this))
val myJob = dispatcher.newJobBuilder()
.setService(MyJobService::class.java)
.setTag("my-jobservice-tag")
.setRecurring(true)
.setTrigger(Trigger.executionWindow(10,20))
.setReplaceCurrent(true)
.build()
dispatcher.mustSchedule(myJob)
If You're Testing this on Android Device with Android Pie
Please go through this Behavioral changes From Android Pie :
Android Pie Changes
Hope this Helps you