Fragment与Activity的生命周期

Fragment的生命周期和activity如何的一个关系


上图是activity与fragment的关系图

1.onAttach()
API文档:public void onAttach (Activity activity) –Called when a fragment is first attached to its activity. onCreate(Bundle)will be called after this.
onAttach()回调将在Fragment与其Activity关联之后调用。需要使用Activity的引用或者使用Activity作为其他操作的上下文,将在此回调方法中实现。

注意:Fragment类有一个getActivity()方法,返回与Fragment关联的Activity。在Fragment的整个生命周期中,初始化参数包(Bundle)可以从碎片的getArguments()方法获得。
切忌:将Fragment附加到Activity以后,就无法再次调用setArguments()——除了在最开始,无法向初始化参数添加内容。

2.onCreate()回调
接下来回调的方法就是onCreate(),大家可以不要与Activity的onCreate()回调方法混淆了。此回调获取传入的参数包(备注:如果在创建时设置了参数包(Bundle)的话就可以获得),不应该将需要依赖于Activity视图层次结构的存在性的代码放在此回调方法中,尽管Fragment现在可能已经与其Activity关联,但是我们还没有获得Activity的onCreate()已完成的通知,所以不能将依赖于Activity视图层次结构存在性的代码放入此回调方法中。
(备注:在onCreate()回调方法中,我们应该尽量避免耗时操作(避免阻塞UI线程),在实际项目中触发后台线程进行准备非常有用,阻塞调用应该位于后台线程中。)

3.onCreateView()回调
创建Fragment视图。

4.onActivityCreated()回调
onActivityCreated()回调会在Activity完成其onCreate()回调之后调用。在调用onActivityCreated()之前,Activity的视图层次结构已经准备好了,这是在用户看到用户界面之前你可对用户界面执行的最后调整的地方。(备注:如果Activity和她的Fragment是从保存的状态重新创建的,此回调尤其重要,也可以在这里确保此Activity的其他所有Fragment已经附加到该活动中了)

5. Fragment与Activity相同生命周期调用
接下来的onStart()\onResume()\onPause()\onStop()回调方法将和Activity的回调方法进行绑定,也就是说与Activity中对应的生命周期相同。

6.onDestroyView()回调
该回调方法在视图层次结构与Fragment分离之后调用。

7.onDestroy()回调
不再使用Fragment时调用。(备注:Fragment仍然附加到Activity并任然可以找到,但是不能执行其他操作)

8.onDetach()回调
Fragme生命周期最后回调函数,调用后,Fragment不再与Activity绑定,释放资源 。

通过以上说明,纵观Fragment生命周期和Activity生命周期整合后如图1-5所示:

9.巧妙使用setRetainInstance()
为什么会在这儿花一定的篇幅详细说明setRetainInstance()方法呢?因为此方法可以有效地提高系统的运行效率,对流畅性要求较高的应用可以适当采用此方法进行设置。
Fragment有一个非常强大的功能——就是可以在Activity重新创建时可以不完全销毁Fragment,以便Fragment可以恢复。在onCreate()方法中调用setRetainInstance(true/false)方法是最佳位置。当Fragment恢复时的生命周期如图1-6所示,注意图中的红色箭头。当在onCreate()方法中调用了setRetainInstance(true)后,Fragment恢复时会跳过onCreate()和onDestroy()方法,因此不能在onCreate()中放置一些初始化逻辑,切忌!


方法 功能说明
onAttach 在Fragment与Activity关联之后被调用。虽然初始化Fragment参数可以通过getArguments()获得,但当Fragment附加到Activity之后,就无法再调用setArguments()。so除了在最开始时,其它时间都无法向初始化参数添加内容
onCreate Fragment初次创建时调用。但此刻Activity还没有创建完成,因为我们的Fragment也是Activity创建的一部分。所以当你尝试在在这无法获取Activity的一些资源
onCreateView 主要用于创建Fragment自身的UI,可用使用LayoutInflater对象的inflater()方法把布局xml映射为view,所以返回值必须是Fragment自身UI对应的view,但如果fragment没有用户界面可以返回null
onActivityCreated 在Activity的OnCreate()结束后,会调用此方法。即此时Fragment和Activity均已创建完毕。所以我们可以在这个方法里使用Activity的所有资源
onStart 当Fragment对用户就是可见时,但用户还未开始与Fragment交互。因为是与Activity的OnStart()绑定的。写在Activity的OnStart()中处理的逻辑,换成用Fragment来实现时,依然可以放在OnStart()中来处理。
onResume 当Fragment对用户可见并且正在运行时调用。即Fragment与用户交互之前的最后一个回调。与onStart类似,也是与Activity的OnResume是相互绑定的,它依赖于包含它的Activity的Activity.onResume。当OnResume()运行完毕之后,就可以正式与用户交互了
onPause 与Activity的OnPause()绑定,意义也一样。当用户离开Fragment时第一个调用这个方法(但并不总意味着Fragment将被销毁)。按照经验,当用户结束会话之前,我们可以在这提交一些变化
onStop 与Activity绑定,已停止的Fragment可以直接返回到OnStart()回调,然后调用OnResume()。
onDestroyView 当Fragment将被结束或者保存,那么下一个回调将是onDestoryView(),将会删除在onCreateView创建的视图。下次这个Fragment若要显示,将会重新创建新视图。这会在onStop之后和onDestroy之前调用。经测试这个方法的调用同onCreateView是否返回非null视图无关。它会在的在这个视图状态被保存之后以及它被它的父Activity回收之前调用
onDestrory 当Fragment不再使用时被调用。但即使调用了onDestroy()阶段,仍可以从其依附的父Activity中找到,因为它还没有Detach。
onDetach 当Fragment和Activity分离的时候调用,Fragment就不再与Activity相绑定,它也不再拥有视图层次结构,它的所有资源都将被释放
一旦Activity进入resumed状态(也就是running状态),我们就可以自由地添加和删除Fragment了。因此,只有当Activity在resumed状态时,Fragment的生命周期才能独立的运转,其它时候是依赖于Activity的生命周期变化的。

你可能感兴趣的:(Android基础知)