luj*_*jop 10 android android-lifecycle android-fragments
查看https://github.com/xxv/android-lifecycle上的优秀图表,它表示在片段重启时不会调用onActivityCreated().
我对此表示怀疑:
注1:我已经测试过,由于活动重新创建而添加了Fragment时调用了onActivityCreated,并且在活动完全启动和激活后手动添加片段时也是如此.
注2:我正在使用23.3.0支持版本进行测试.某些行为是否有可能从以前的版本发生变化?
宿主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的源代码(我没有看到这样的流程)。