onActivityCreated被废弃,如何正确使用LifecycleObserver?

问题描述 投票:1回答:1

Google在Android上废止了fragment的onActivityCreated(),推荐使用LifeCycleObserver。

 To get a callback specifically when a Fragment activity's
     * {@link Activity#onCreate(Bundle)} is called, register a
     * {@link androidx.lifecycle.LifecycleObserver} on the Activity's
     * {@link Lifecycle} in {@link #onAttach(Context)}, removing it when it receives the
     * {@link Lifecycle.State#CREATED} callback.

所以我试着用推荐的方式来做,但在Logcat中我能观察到的状态只有一个: 国家: 初始化.

 private lateinit var lifecycleObserver: LifecycleObserver

 override fun onAttach(context: Context) {
    super.onAttach(context)

    hostActivity = context as HostActivity

    lifecycleObserver = object : LifecycleObserver {

        @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
        fun onCreate() {
            Logger.tag("SOME-TAG")d("State: ${lifecycle.currentState}")

            if(lifecycle.currentState.isAtLeast(Lifecycle.State.CREATED)) {
                Logger.tag("SOME-TAG").d("CREATED")
                hostActivity.lifecycle.removeObserver(lifecycleObserver)
            }
        }
    }

    hostActivity.lifecycle.addObserver(lifecycleObserver)
}

以上代码有什么问题?

更新1: 看来我忘了使用hostActivity.lifecycle.currentState,检查了fragment的生命周期而不是Activities的生命周期。

更新2: Google建议的方法对于1个Host活动和2个fragment没有用,当你从一个点击返回按钮到另一个的时候,原因是onAttach从来没有被调用,但是onActivityCreated被调用。

android android-fragments android-activity android-lifecycle
1个回答
4
投票

根据变更日志 此处

onActivityCreated() 方法现在已被废弃。触及片段视图的代码应在 onViewCreated() 前调用 onActivityCreated())和其他初始化代码应在 onCreate(). 要接收回调,特别是当该活动的 onCreate() 是完整的,一个 LifeCycleObserver 应在活动的生命周期中登记。onAttach(),一经移除 onCreate() 回调被接收。

你可以在你的片段类中做这样的事情。

class MyFragment : Fragment(), LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    fun onCreated(){
        activity?.lifecycle?.removeObserver(this)
    }

    override fun onAttach(context: Context) {
        super.onAttach(context)
        activity?.lifecycle?.addObserver(this)
    }
}

0
投票

你可以把Lifecycle.State看作是一个图中的节点 Lifecycle.Event看作是这些节点之间的边。

所以你永远不会在你的ON_CREATE函数中到达State.Created。

解决方法

class YourFragment : Fragment(), LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun onCreated(){
        Log.i("tag","reached the State.Created")
    }

    override fun onAttach(context: Context) {
        super.onAttach(context)
        lifecycle.addObserver(this)
    }

    override fun onDetach() {
        super.onDetach()
        lifecycle.removeObserver(this)
    }
}

更多详情

https:/developer.android.comtopiclibrariesarchitecturelifecycle#lc。


0
投票

我用下一个方法做的。

class MyActivityObserver(
    private val update: () -> Unit
) : DefaultLifecycleObserver {

    override fun onCreate(owner: LifecycleOwner) {
        super.onCreate(owner)
        owner.lifecycle.removeObserver(this)
        update()
    }
}

并将它用在onAttach(或其他生命周期方法)的片段中,比如:

myActivity.lifecycle.addObserver(MyActivityObserver {
    myOnActivityCreated()
})
© www.soinside.com 2019 - 2024. All rights reserved.