是否总是调用onActivityCreated?

luj*_*jop 10 android android-lifecycle android-fragments

查看https://github.com/xxv/android-lifecycle上的优秀图表,它表示在片段重启时不会调用onActivityCreated().

我对此表示怀疑:

  • 真的吗?有人可以提供一些链接来做解释生命周期行为的文档吗?
  • 究竟什么是Fragment restart()?
  • Android可以决定删除不可见的片段,但是保留那些包含它们的活动吗?

注1:我已经测试过,由于活动重新创建而添加了Fragment时调用了onActivityCreated,并且在活动完全启动和激活后手动添加片段时也是如此.

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

Max*_*m G 3

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

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

有些方法在Fragment中不存在(比如onRestart()、onRestoreInstanceState(),不知道为什么)。所以重启发生在宿主机中,它会触发Fragment的onStart()、onResume(),就认为它是随着Activity一起重启的。

又是一个执着与超然的故事。在某些回调中,您希望安全地使用视图树,而 onActivityCreated() 是一个很好的候选者,因此它不会重新启动。

我猜 Fragment 没有 onRestart() ,因为它由开发人员来管理返回堆栈,并且您可以保留 Fragments (您不应该将其放入返回堆栈中)。

最好的证明就是代码。尝试使用日志记录。前段时间我自己做过,因为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
Run Code Online (Sandbox Code Playgroud)

我们有两个学期“娱乐”和“重新开始”。

重新创建仅在视图树的修改(甚至是潜在的,当 Fragment 没有 UI 时)发生时发生。

当您的视图树稳定时(例如,您的活动在返回堆栈中包含片段并且您想要将其取回),就会重新启动。

Android 可以决定删除不可见的片段但保留保存它们的 Activity 吗?

我相信 Android 操作系统杀死的唯一可管理的量子是一个进程(但这是有争议的)。

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