使用 LifecycleObserver 的生命周期感知组件如何感知屏幕方向变化

How can lifecycle aware components using LifecycleObserver be aware of screen orientation changes

使用 LifecycleObserver 例如,制作生命周期感知组件非常容易当用户离开屏幕时暂停和停止 MediaPlayer

但是有什么方法可以让我知道生命周期是否正在经历 onPauseonStop 等,仅仅是因为配置更改正在发生?在那种情况下,我不会对 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 作为参数。我不知道这个存在,没有找到关于它的官方文档,我的一个同事告诉我这个并且它有效。

无论如何只需检查 lifecycleOwnerFragment 还是 Activity,然后调用 activity?.isChangingConfigurationisChangingConfiguration

简而言之,像这样的东西会起作用:

@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onStop(lifecycleOwner: LifecycleOwner) {
    // Cast lifecycleOwner to Fragment or Activity and use isChangingConfiguration
}