Android 生命周期感知组件如何检测 ViewModel 内部的配置更改

Android How Lifecycle-Aware Components Detect Configuration Change inside ViewModel

我的Fragment:

class FirstFragment : Fragment() {
    private lateinit var binding: FragmentFirstBinding
    private lateinit var viewModelFactory: FirstViewModelFactory
    private lateinit var viewModel: FirstViewModel

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
        binding = DataBindingUtil.inflate(inflater, R.layout.fragment_first, container, false)
        viewModelFactory = FirstViewModelFactory(requireActivity().application, this.lifecycle) //<- Lifecycle object
        viewModel = ViewModelProvider(this, viewModelFactory).get(FirstViewModel::class.java)

        return binding.root
    }
}

我的ViewModel:

class FirstViewModel(application: Application, lifecycle: Lifecycle) : AndroidViewModel(application), LifecycleObserver {
    init {
        lifecycle.addObserver(this)
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    private fun showOnStopMessage() {
        Log.v("xxx", "onStop called!!")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    private fun showOnStartMessage() {
        Log.v("xxx", "onStart called!!")
    }
}

以上设置在no-configuration-change环境下运行良好,showOnStopMessage()在应用进入后台时被调用,showOnStartMessage()被调用当应用程序返回前台时。

问题是,当 配置更改 发生时(如旋转屏幕),这些函数不再被调用。

为什么会这样?如何检测并“生存”配置更改?提前致谢。

据我了解,问题在于您的 ViewModel 仅创建一次(应该创建),并且它仅将第一个片段的生命周期添加为 LifecycleObserver。当您旋转屏幕时,会返回相同的 ViewModel,并且它仍会尝试对旧 Fragment 的变化做出反应,而这不会发生。

我建议根本不要处理 ViewModel 内部的生命周期(从 Factory 和 ViewModel 中删除相关代码)。只需致电:

lifecycle.addObserver(viewModel)

获取 ViewModel 之后,在 onCreateView 中。