首页 > 解决方案 > Android - 在什么情况下/用例我想实现一个自定义 LifecycleOwner

问题描述

https://developer.android.com/topic/libraries/architecture/lifecycle#implementing-lco

文档说Fragments and Activities in Support Library 26.1.0 and later already implement the LifecycleOwner interface.如果我们可以使用 Activity 或 Fragment 的 LifecycleOwner 来注册 LiveData 对象或让它调用我们注释的方法,这将非常有用

@OnLifecycleEvent(Lifecycle.Event.ON_START)
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
etc

在我们的自定义类中。

但我们也可以选择实现自定义 LifecycleOwner。在什么情况下有一个自定义 LifecycleOwner 是有意义的,考虑到它会使事情复杂化,因为现在我们必须手动跟踪生命周期事件,例如:

mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP);
etc

?

标签: androidlifecycleandroid-livedatalifecycleowner

解决方案


我想我可以自己回答这个问题,使用自定义LifecycleOwner有意义的用例是,如果您有一个非典型的生命周期,这意味着与一个活动和片段具有不同的生命周期。

我必须使用片段在手机的锁屏上加载广告,这意味着必须在手机屏幕关闭时加载广告,而用户​​在按下开机按钮时会看到广告电话并打开显示屏。

这种行为很重要:广告必须在后台加载(屏幕关闭),当用户打开屏幕时,广告就在那里供用户查看。

在屏幕关闭时执行片段事务意味着事务将在onStop()调用 Activity 之后发生,并且只能使用commitAllowingStateLoss().

此外,作为参数传递给片段的数据必须并且可以在屏幕关闭时更新,这也意味着当活动处于停止状态时。

因此,我必须创建一个自定义对象,LifecycleOwner以便与一个LiveData对象一起使用,该对象将观察应该传递给片段的数据的变化。

此自定义LifecycleOwner实现将忽略活动的停止状态,这样LiveData即使活动处于停止状态,也可以对数据更改做出反应。


推荐阅读