问题描述
我正在一个项目中,该项目在LiveData
内使用Service
实例。
我们通过Activity将服务初始化为绑定服务,因此我们使用bindService()
和unBindService()
进行连接和断开连接。我们分别在“活动”生命周期的onResume()
和onPause()
中调用这些函数。
class TestActivity: Activity() {
lateinit var ourService: OurService
val serviceConnection: ServiceConnection = object : ServiceConnection {
override fun onServiceConnected(className: ComponentName,service: IBinder) {
val binder = service as OurService.LocalBinder
ourService = binder.getService()
// Does this cause ourService to be retained beyond unbind the only client
ourService.liveReading.observe(this@TestActivity,Observer {}
}
}
override fun onResume() {
Intent(this,OurService::class.java).also { intent ->
bindService(intent,serviceConnection,Context.BIND_AUTO_CREATE)
}
}
override fun onPause() {
unBindService(serviceConnection)
}
}
我注意到在某些情况下,我在OurService的LiveData
属性中获得了多个发射。我不知道这是否是因为将所有者设置为活动,该活动在onPause / onResume循环后仍然存在,导致该服务在onPause情况下不会被破坏,并因此导致在另一个onPause /循环之后将多个观察者分配给活动数据onResume。
解决方法
因为我看不到您的服务代码,所以您在这里需要注意两点
- 调用unBindService并不意味着您的服务将被销毁,您可以在https://developer.android.com/reference/android/app/Service这里检查服务生命周期
- 致电
ourService.liveReading.observe(this@TestActivity,Observer {}
时 您应该注意到,您正在使用TestActivity的LifecycleOwner。这意味着liveReading
将在TestActivity调用DESTROYED状态时停止接收数据。在您的情况下,TestActivity不调用DESTROYED状态(仅调用onPause),因此liveReading
仍接收数据,问题是当您的活动调用onPause时会发生什么?这是你的答案
在LifecycleOwner不活动的情况下更改数据时,将不会 接收任何更新。如果再次激活,它将收到 自动最后一次可用的数据