在Android服务中(取消)注册传感器监听器并不总是有效

时间:2019-12-02 16:21:08

标签: android kotlin android-service android-sensors

我创建了一个自定义服务,用于监听设备加速度计,并且希望能够暂停传感器读数。在两种情况下,我想暂停传感器的读数,首先是GUI中的“暂停”按钮暂停所有传感器(现在我刚刚实现了加速度计,但是会跟随更多的传感器),其次是传感器在应用程序设置。我使用一个可观察的对象来观察应用程序设置和Intent for Pause按钮的变化,该按钮调用了unregisterSensors()函数(请参见下面的代码)。在首次运行的应用程序上这可以正常工作,但是当我关闭并重新打开该应用程序时,行为变得很奇怪。从应用程序设置中注销侦听器总是可以的,但使用GUI中的“暂停”按钮时突然无法工作,即使确实调用了unregisterSensors()函数(意图很好)。如果我强制该应用退出Android设置或Android Studio并再次启动,则我又恢复了正常的行为,但是从多任务栏中删除该应用时并没有这样说。这是服务类的相关代码:

class SensorService: Service(), SensorEventListener {
    private var sensorAccelerometer: Sensor? = null
    private var sensorLinearAccelerometer: Sensor? = null

    private lateinit var sensorManager: SensorManager


    companion object {
        var isServiceStarted = false

        var recordAccelerometer = MutableLiveData<Boolean>().apply { value = true }
    }

    override fun onCreate() {
        super.onCreate()
        sensorManager = applicationContext.getSystemService(Context.SENSOR_SERVICE) as SensorManager
        recordAccelerometer.observeForever { value ->
            if (sensorAccelerometer != null) {
         // Always works       
         if (value) {
                    sensorAccelerometer?.also {acceleration ->
                        sensorManager.registerListener(this, acceleration, SensorManager.SENSOR_DELAY_FASTEST)
                    }
                    sensorLinearAccelerometer?.also { acceleration ->
                        sensorManager.registerListener(this, acceleration, SensorManager.SENSOR_DELAY_FASTEST)
                    }
                } else {
                    sensorManager.unregisterListener(this, sensorAccelerometer)
                    sensorManager.unregisterListener(this, sensorLinearAccelerometer)
                }
            }
        }

        isServiceStarted = true
    }

    override fun onDestroy() {
        super.onDestroy()

        // Unregister sensors
        unregisterSensors()
        isServiceStarted = false
    }

    private fun registerSensors() {
        // Register sensors
        if (availableSensors["accelerometer"]!! && recordAccelerometer.value!!) {
            sensorAccelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
            sensorLinearAccelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION)

            sensorAccelerometer?.also {acceleration ->
                sensorManager.registerListener(this, acceleration, SensorManager.SENSOR_DELAY_FASTEST)
            }
            sensorLinearAccelerometer?.also { acceleration ->
                sensorManager.registerListener(this, acceleration, SensorManager.SENSOR_DELAY_FASTEST)
            }
        }
    }


    private fun unregisterSensors() {
        // Unregister sensors
        // Works not after closing and opening the app
        sensorManager.unregisterListener(this, sensorAccelerometer)
        sensorManager.unregisterListener(this, sensorLinearAccelerometer)
    }

    override fun onTaskRemoved(rootIntent: Intent?) {
        super.onTaskRemoved(rootIntent)
        // Stop service unless sensors are being recorded
        stopSelf(1)
    }
}

任何人都可能知道问题是什么?我在调用sensorManager.unregisterListener(...)时看不到任何可能导致此问题的区别。

1 个答案:

答案 0 :(得分:1)

因此,如果将来有人遇到同样的问题,我现在就找到了解决方案。问题是我在活动中绑定到该服务,并且每次绑定到绑定的服务时都会返回一个新实例。因此,确实已经假设@ greeble31使用了不同的事件侦听器。由于需要绑定到服务,因此我现在使用LiveData注册/注销传感器。

accelerometerRegistered.observeForever { value ->
    if (value) {
        sensorAccelerometer?.also {acceleration ->
            sensorManager.registerListener(this, acceleration, SensorManager.SENSOR_DELAY_FASTEST)
        }
    } else {
        sensorManager.unregisterListener(this, sensorAccelerometer)
    }
}

LiveData对象是在伴随对象中定义的,因此我可以在Service类的内部和外部对其进行更改。

相关问题