Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用LifecycleObserver的生命周期感知组件如何感知屏幕方向的更改_Android_Android Lifecycle - Fatal编程技术网

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
的目的。您误读了,它们的意思是不要将它作为字段保留在类中。简单地把它作为一个参数就可以了。函数结束后,函数作用域/堆栈将被删除,这意味着您不会保留对收到的任何参数的引用,除非您将它们存储为类成员。