活动与碎片生命周期对比

20
我正在开发一个新应用程序,其中我正在使用 ActivityFragment。 它们之间有什么主要区别吗?
更新
我在 Android 文档中找到了想要的好答案。
文档描述了:活动和片段之间生命周期中最重要的区别是它们在各自的后堆栈中存储的方式。当活动停止时,默认情况下,系统将其放置在由系统管理的活动后堆栈中(以便用户可以使用“返回”按钮导航回它,如任务和后退堆栈所讨论的那样)。但是,只有在通过删除片段的事务期间调用 addToBackStack() 来显式请求保存实例时,才会将片段放置在由宿主活动管理的后退堆栈中。
宿主Activity是否保存与其相关联的不同Fragment的不同后退堆栈?是否存在您的单个应用程序保留多个堆栈的任何情况?

4
不是由我决定,活动并不取决于片段的生命周期,但片段取决于活动的生命周期。 - Lucifer
好的.. http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle http://developer.android.com/reference/android/app/Fragment.html#Lifecycle - denis.solonenko
是的,这不是一个坏问题。但它更像是一个讨论性质的问题,你可以在谷歌或开发者网站上找到答案。 - Lucifer
请查看以下两个链接,分别是片段(Fragment)的生命周期和活动(Activity)的生命周期。希望您能够通过自己的研究了解它们之间的区别。这并不是一个坏问题,我不会给你投反对票。但首先,您应该阅读相关材料并提出具体问题。 - Yogesh D
你真的没有发现区别吗? - Lucifer
好的,我相信你,也许你没有仔细搜索。因为很多博客和网站都提到了这些差异。 - Lucifer
3个回答

51
 Differences between Activity and Fragment lifecyle in Android

Fragment是活动的一部分,它为该活动提供自己的UI。Fragment可以被视为子活动。在更大的屏幕设备上,使用Fragment可以更有效地使用空间。

根据屏幕大小,一个活动可能包含零个或多个片段。一个片段可以在多个活动中重复使用,因此它在活动中充当可重复使用的组件。

片段不能独立存在。它应该始终是活动的一部分。而活动可以在其中没有任何片段的情况下存在。

片段的生命周期比活动的生命周期更复杂,因为它有更多的状态。生命周期状态如下图所示:

enter image description here

onInflate

在片段生命的最开始,调用onInflate方法。我们可以在此方法中保存一些配置参数和在XML布局文件中定义的属性。

onAttach

接着调用onAttach。这个方法被称为片段“附加”到“父”活动时立即调用,我们可以使用这个方法来存储关于活动的引用。

onCreate

这是一个非常重要的步骤,我们的片段正在创建过程中。可以使用此方法启动一些线程来检索数据信息,可能是从远程服务器检索的。当片段需要创建其视图层次结构时,调用onCreateView方法。在此期间,我们将在片段内填充我们的布局。

在这个阶段,我们不能确定我们的活动是否已经创建,因此我们无法依赖它进行某些操作。在onActivityCreated中,当“父”活动被创建并准备就绪时,我们会得到通知。

从现在开始,我们的活动是活跃且已创建,我们可以在需要时使用它。

onStart

下一步是onStart方法。在这里,我们做与活动onStart相同的常见事情,即在此阶段,我们的片段可见,但尚未与用户交互。

onResume

当片段准备好与用户交互时,调用onResume。

然后,可能会出现活动暂停的情况,因此也会调用活动的onPause方法,同时也会调用片段的onPause方法。

之后,操作系统可能决定销毁我们的片段视图,因此会调用onDestroyView。如果系统决定解散我们的片段,则会调用onDestroy方法。

在这里,我们应该释放所有连接和其他活动,因为我们的片段即将死亡。即使在销毁阶段,它仍然附加到父活动上。最后一步是将片段从活动中分离,当调用onDetach时发生。

希望您可以从中理解。

谢谢。


1
我看到你已经解释了片段生命周期中的每个方法,OP只是简单地问了你FragmentActivity生命周期之间的主要区别,而不是像什么是Fragment及其回调描述这样的完整描述。 你应该再读一遍问题,所以去读一下吧。 - Ajay S
7
你漏掉了onStop - Malwinder Singh
1
@Malwinder,是的,在https://www.javacodegeeks.com/2013/06/android-fragment-lifecycle-multiple-screen-support.html中,onStop也被忽略了 :) - CoolMind

11

来自开发者碎片指南 -

托管Fragment的Activity的生命周期直接影响Fragment的生命周期,因此每个Activity的生命周期回调都会导致每个Fragment的类似回调。

例如,当Activity收到onPause()时,Activity中的每个Fragment都会收到onPause()

然而,Fragment还有一些额外的生命周期回调函数,用于处理与Activity的唯一交互,以执行构建和销毁Fragment UI等操作。这些附加的回调方法如下:

1) onAttach() =>

当Fragment与Activity相关联时调用(在此处传递Activity)。

2) onCreateView() =>

用于创建与Fragment关联的视图层次结构。

3) onActivityCreated() =>

当Activity的onCreate()方法返回后调用。

4) onDestroyView() =>

正在删除与Fragment关联的视图层次结构时调用。

5) onDetach() =>

当Fragment正在与Activity解除关联时调用。

一旦Activity达到已恢复状态,您就可以自由地向Activity添加和删除Fragment。因此,只有在Activity处于已恢复状态时,Fragment的生命周期才能独立更改。

但是,当Activity离开已恢复状态时,Fragment再次通过Activity被推送到其生命周期中。

请查看Activity and Fragments


@TGMCians - 这是直接从文档中提取的,没有任何修改。请看“Fragments have a few extra lifecycle callbacks”这一行。这并没有提到什么新东西。是的,你可以说它并没有涵盖完整的差异。 - My God

0

从某种意义上来说,它们是相似的。两者都在屏幕上存在时才有其生命周期。如果您的活动被关闭,则稍后会停止并销毁。同样,如果片段不再在屏幕上可用,则会被销毁。但由于片段存在于活动内部,因此当其他片段替换此片段时,片段很可能被销毁。因此,它拥有类似但不同的生命周期。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接