- 理解Fragment的生命周期
我们开发Android应用程序的挑战之一是确保应用程序能成功地处理Activity的生命周期。在应用程序的生命周期中,一个给定的activity可能被创建、销毁和重新创建多次。比如用户旋转屏幕,会引起可见的activity被完全销毁,并且系统会使用合适的资源重新创建一个的activity。应用程序如果不能有效地处理好Activity生命周期会导致程序经常Crash或其他不愿看见的错误。
每个Fragment实例存在于单独的一个activity中,因此Fragment必须以某种方式与Activity的生命周期合作。Fragment不仅与Activity的生命周期合作,而且他们之间有“密切”联系。
在Fragment的建立和显示阶段以及隐藏和销毁阶段,Fragment提供了类似于Activity生命周期的回调函数,此外Fragment额外提供了与activity有关系的回调方法。
1.1 理解Fragment的建立和显示
Fragment的建立和显示是一个需要fragment与activity协作的多相过程,包括fragment的创建、以及将activity置于运行态的一系列标准生命周期事件。为了高效地使用fragment,了解其生命周期事件的行为与其相关的回调方法是非常重要的。一旦我们了解了其生命周期事件和回调方法,我们就能明白生命周期事件的回调方法是怎样使用的。
下图是Fragment的创建和显示的过程
在大多数情况下,建立和显示fragment发生在activity的onCreate方法中。多数情况下,当在activity的onCreate回调方法中调用了setContentView方法,接着当加载布局资源后会触发activity与其包含fragment的关联。
当fragment创建之前,fragment会附着(attach)到activity。首先,通过调用fragment的onAttach回调方法,fragment会接收到一个activity的引用,并附属于activity。接着activity通过其onAttachFragment回调方法,activity会接收到fragment的一个引用。
虽然在fragment创建之前将其附属于activity的做法有点出乎意料,但是这样做是非常有用的。在很多情况下,fragment在其创建过程中需要访问activity,因为activity经常包含fragment显示所需要的信息或者其他重要信息。
当fragment附属到activity后,fragment会调用onCreate进行创建工作,接着通过onCreateView构建View hierarchy。
当一个activity包含多个fragment时,Android针对每个Fragment会连续循环调用以下四个方法:Fragment.onAttach,Activity.onAttachFragment,Fragment.onCreate,和Fragment.onCreateView。这样做是确保下一个fragment开始以上过程之前,先前的fragment完成了附属(attach)、创建的过程。
当所有的fragment都完成了上述四个方法地调用,剩下的步骤就是每个fragments单独的调用其建立和显示的回调方法。在activity完成了onCreate方法的调用,Android会调用fragment的onActivityCreated方法。onActivityCreated方法调用后表面表明所有的view、fragment被activity的布局资源创建并且能安全地被访问。
fragment也有onStart、onResume的回调方法,这跟Activity的生命周期回调方法类似,不过fragment的onStart、onResume的调用时机分别是在Activity完成了其onStart、onResume的调用。
对很多fragment来说,我们只需要重写他们生命周期中的onCreate和onCreateView方法。
Activity和Fragment有很多名字相同的回调方法,它们当中很多作用是类似的。但是有一个很重要的例外—onCreateView方法, Activity和Fragment各自的onCreateView方法的作用大相径庭。就像前文提到,Android调用Fragment类的onCreateView方法,这样就给了该fragment一个机会去创建并返回fragment所包含的View hierarchy。该方法在fragment中通常被重写。而Activity的onCreateView方法是在inflate布局资源过程中被LayoutInflate类重复调用。很多Activity是不需要重写该方法。
PS:该片文章是翻译自
Creating Dynamic UI with Android Fragments,该文档通篇都是介绍Fragment,我觉得读后大有收获!