打开新屏幕后返回屏幕时,LiveData值会重新出现

时间:2018-09-22 18:21:54

标签: android android-livedata

问题

当用户单击应用程序的RecyclerView单元中的某个项目时,我已经从片段实现了YouTube意图。 click事件是通过数据绑定在xml中处理的,并传递到绑定的 ViewModel ,后者将代表点击事件的 LiveData 值传递给 Fragment

startActivity(YouTubeIntents.createPlayVideoIntentWithOptions(activity, content.id, false, false))    

但是,在触发onBackPressed()以关闭从YouTube启动的活动并返回到原始应用屏幕之后,当屏幕旋转时,好像没有使用YouTube活动的finish()方法一样,YouTube活动就会重新出现叫。

预期

关闭YouTubeActivity后旋转屏幕不会触发YouTubeActivity意外重新显示。

尝试的解决方案

  1. 对将传递给Intent的上下文从context更改为activity进行了实验。
  2. 从片段中调用context.startActivity(...),而不是startActivity(...)
  3. 根据新的answer,为新的活动意图添加了一个标志:intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)
  4. 将YouTube的意图包装在“无头”片段(没有UI的片段)中,以尝试控制生命周期。

1 个答案:

答案 0 :(得分:0)

解决方案

这与YouTube API无关,而是与Android体系结构库组件 LiveData 相关。我正在使用 LiveData 变量传递点击事件,该事件在屏幕旋转时会再次发出。

何塞·阿尔塞雷卡(JoseAlcérreca)在他的中号帖子LiveData with SnackBar, Navigation and other events (the SingleLiveEvent case)中概述了最佳解决方案。

总而言之,Jose创建了一个Event类,用于跟踪事件是否已处理。这样,在旋转屏幕时 ViewModel LiveData 不要发出对单个事件不再有效的值。