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

标签 android android-lifecycle

使用 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,因此不希望传递对 fragment 的弱引用。

最佳答案

事实证明,生命周期事件函数可以接收 lifecycleOwner 作为参数。我不知道这个存在,没有找到关于它的官方文档,我的一个同事告诉我这个并且它有效。

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

简而言之,这样的事情会起作用:

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

关于android - 使用 LifecycleObserver 的生命周期感知组件如何感知屏幕方向变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59408310/

相关文章:

Android - 执行停止未恢复的 Activity

android - 改造 - android.os.NetworkOnMainThreadException 与 RxKotlin

Android 最小按钮高度 : 48dp = 9mm?

android - startLeScan 替换为当前 api

android - Android 可以在循环执行过程中终止我的应用程序吗?

java - 响应不是来自使用 retrofit2 的服务器

android - 重新启动已经运行的 Activity

java - AndroidViewModel 没有零参数构造函数

android - Activity 跳转开始时的动画

android-lifecycle - RoboSpice shouldStop() 真的需要吗?