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被调用。
根据变更日志 此处
该
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)
}
}
你可以把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。
我用下一个方法做的。
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()
})