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