我创建了一个自定义服务,用于监听设备加速度计,并且希望能够暂停传感器读数。在两种情况下,我想暂停传感器的读数,首先是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(...)时看不到任何可能导致此问题的区别。
对于给定的传感器,您已经两次呼叫registerListener()
,而不必两次呼叫unregisterListener()
。或者,换句话说,即使您已经注册,您也叫registerListener()
。