[(Un)在Android服务中注册传感器侦听器并不总是有效

问题描述 投票:0回答:1

我创建了一个自定义服务,用于监听设备加速度计,并且希望能够暂停传感器读数。在两种情况下,我想暂停传感器的读数,首先是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(...)时看不到任何可能导致此问题的区别。

android kotlin android-service android-sensors
1个回答
0
投票

对于给定的传感器,您已经两次呼叫registerListener(),而不必两次呼叫unregisterListener()。或者,换句话说,即使您已经注册,您也叫registerListener()

© www.soinside.com 2019 - 2024. All rights reserved.