Android 使用LifecycleObserver的生命周期感知组件如何感知屏幕方向的更改
使用Android 使用LifecycleObserver的生命周期感知组件如何感知屏幕方向的更改,android,android-lifecycle,Android,Android Lifecycle,使用LifecycleObserver制作生命周期感知组件非常简单,例如当用户离开屏幕时暂停和停止MediaPlayer 但是,有没有办法让我知道生命周期是否仅仅因为配置发生了变化而经历了暂停、停止等过程?在这种情况下,我不会对MediaPlayer做任何事情。在Fragment中有activity?.isChangingConfiguration()但是在LifecycleObserver中,据我所知,我没有得到这样的信息 class AudioPlayerLifecycleObserver(
LifecycleObserver
制作生命周期感知组件非常简单,例如当用户离开屏幕时暂停和停止MediaPlayer
但是,有没有办法让我知道生命周期是否仅仅因为配置发生了变化而经历了暂停、停止等过程?在这种情况下,我不会对MediaPlayer
做任何事情。在Fragment
中有activity?.isChangingConfiguration()
但是在LifecycleObserver
中,据我所知,我没有得到这样的信息
class AudioPlayerLifecycleObserver(private val mediaPlayer: MediaPlayer) : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun onPause() {
// Media player will pause even if the screen is just changing orientation
mediaPlayer.pause()
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onStop() {
// Media player will stop even if the screen is just changing orientation
mediaPlayer.stop()
}
}
媒体播放器停止和暂停仅用于演示目的
请注意,所考虑的体系结构是MVVM,因此传递对片段的弱引用是不可取的。事实证明,生命周期事件函数可以接收
生命周期所有者作为参数。我不知道它的存在,也没有在上面找到官方文件,我的一位同事告诉我这件事,它起作用了
无论如何,只需检查lifecycleOwner
是否是片段
或活动
,然后调用Activity?.isChangingConfiguration
或isChangingConfiguration
简言之,类似这样的方法是可行的:
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onStop(lifecycleOwner: LifecycleOwner) {
// Cast lifecycleOwner to Fragment or Activity and use isChangingConfiguration
}
你能分享你的生命周期感知组件的代码片段吗?你也能在Fragment
上进行配置更改检查吗?我已经试过了,但似乎没有属性来验证……Fragment
是否引用了活动
。它确实引用了,但在我的情况下,它帮不了什么忙。我需要在我的视图模型中更改配置信息。因此,让VM
意识到片段
,即使只是在回调中,对于MVVM来说,这并不是最好的主意。因此,我的解决方案是在VM
中创建一个isConfigurationChanging
字段,我将在onPause
中从片段
的活动
引用中更新该字段,此时活动已经知道是否发生了配置更改。研究生命周期感知组件
。这个链接看起来也不错。简而言之,您可以使用LifecycleObserver
来简单地观察生命周期
,避免在VM
中进行自己的回调。这样的回调违背了MVVM
的目的。您误读了,它们的意思是不要将它作为字段保留在类中。简单地把它作为一个参数就可以了。函数结束后,函数作用域/堆栈将被删除,这意味着您不会保留对收到的任何参数的引用,除非您将它们存储为类成员。