gpt4 book ai didi

android - onActivityCreated 总是被调用?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:11:49 26 4
gpt4 key购买 nike

查看https://github.com/xxv/android-lifecycle 的优秀图表它说 onActivityCreated() 不会在 fragment 重启时调用。

我对此表示怀疑:

  • 这是真的吗?有人可以提供一些链接来做解释生命周期行为的文档吗?
  • Fragment restart() 到底是什么?
  • Android 能否决定删除不可见的 fragment ,但保留保存它们的 Activity?

注意 1:我已经测试过,当由于 Activity 重新创建而添加 fragment 时以及在 Activity 完全启动并处于 Activity 状态后手动添加 fragment 时,都会调用 onActivityCreated。

注意 2:我正在使用 23.3.0 支持版本进行测试。是否有可能某些行为与以前的版本相比发生了变化?

最佳答案

宿主Activity的大部分方法都被Fragments镜像。

当您的 Activity 在返回堆栈中并且您点击返回按钮时调用 onRestart(),因此无需重新创建(它只是重新启动)。

有些方法在Fragment中是没有的(比如onRestart(),onRestoreInstanceState(),不知道为什么)。所以restart发生在host中,它触发了Fragment的onStart(),onResume(),就当它和Activity一起重启了。

另一个有依恋和超脱的故事。在某些回调中,您希望安全地使用 View 树并且 onActivityCreated() 是一个很好的候选者,因此它不会重新启动。

我猜 Fragment 没有 onRestart(),因为这取决于开发人员来管理后台堆栈,并且您可以保留 Fragment(您不应该将其放入后台堆栈)。

最好的证明就是代码。尝试玩记录。前段时间我did it myself ,因为 Steve 的项目只测试了一个 Fragment。

按下一点模式(启动 ActivityWithDynamicFragments,然后按下返回按钮),这是一个日志:

 176448881: DynamicFragment.<init> / ctor
176448881: DynamicFragment.onAttach / in base with context
176448881: DynamicFragment.onAttach / in base with activity
176448881: DynamicFragment.onAttach / out base with activity
176448881: DynamicFragment.onAttach / out base with context
176448881: DynamicFragment.onCreate / in base
176448881: DynamicFragment.onCreate / out base
176448881: DynamicFragment.onCreateView / in brand new
176448881: DynamicFragment.onCreateView / out
176448881: DynamicFragment.onViewCreated / in base
176448881: DynamicFragment.onViewCreated / out base
176448881: DynamicFragment.onActivityCreated / in base
176448881: DynamicFragment.onActivityCreated / out base
176448881: DynamicFragment.onViewStateRestored / in base
176448881: DynamicFragment.onViewStateRestored / out base
176448881: DynamicFragment.onStart / in base
176448881: DynamicFragment.onStart / out base
176448881: DynamicFragment.onResume / in base
176448881: DynamicFragment.onResume / out base
176448881: DynamicFragment.onPause / in base
176448881: DynamicFragment.onPause / out base

227303269: ActivityWithDynamicFragments.onCreate / in brand new
227303269: ActivityWithDynamicFragments.onCreate / in base
227303269: ActivityWithDynamicFragments.onCreate / out base
227303269: ActivityWithDynamicFragments.onCreate / after super
227303269: ActivityWithDynamicFragments.onContentChanged / in base
227303269: ActivityWithDynamicFragments.onContentChanged / out base
227303269: ActivityWithDynamicFragments.onStart / in base
227303269: ActivityWithDynamicFragments.onStart / out base
227303269: ActivityWithDynamicFragments.onResume / in base
227303269: ActivityWithDynamicFragments.onResume / out base
227303269: ActivityWithDynamicFragments.onPostResume / in base
227303269: ActivityWithDynamicFragments.onResumeFragments / in base
227303269: ActivityWithDynamicFragments.onResumeFragments / out base
227303269: ActivityWithDynamicFragments.onPostResume / out base
227303269: ActivityWithDynamicFragments.onAttachedToWindow / in base
227303269: ActivityWithDynamicFragments.onAttachedToWindow / out base

176448881: DynamicFragment.onSaveInstanceState / in base
176448881: DynamicFragment.onSaveInstanceState / out base
176448881: DynamicFragment.onStop / in base
176448881: DynamicFragment.onStop / out base
227303269: ActivityWithDynamicFragments.onPause / in base
227303269: ActivityWithDynamicFragments.onPause / out base

D/NSA: onRestart
176448881: DynamicFragment.onStart / in base
176448881: DynamicFragment.onStart / out base
176448881: DynamicFragment.onResume / in base
176448881: DynamicFragment.onResume / out base
227303269: ActivityWithDynamicFragments.onStop / in base
227303269: ActivityWithDynamicFragments.onStop / out base
227303269: ActivityWithDynamicFragments.onDestroy / in base
227303269: ActivityWithDynamicFragments.onDestroy / out base

我们有两个术语 recreation 和 restart。

只有在 View 树的修改(甚至可能,当没有 UI 的 Fragment 时)才会发生重新创建。

当您的 View 树稳定时(例如,您的 Activity 在后台堆栈中有 fragment 并且您想要取回它)。

Can Android decide to delete not visible fragments but mantain the activity that holds them?

我相信唯一可以被 Android 操作系统杀死的可管理量子是一个进程(但它是 debatable )。

关于Fragment,你可以查看FragmentActivity和FragmentManager的源代码(我没有看到这样的流程)。

关于android - onActivityCreated 总是被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36858835/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com