现在的位置: 首页 > 综合 > 正文

Fragment生命周期

2018年05月04日 ⁄ 综合 ⁄ 共 2673字 ⁄ 字号 评论关闭


官方文档中有详细的文字说明,不过最好还是实践下,熟悉过程。http://developer.android.com/guide/components/fragments.html

Activity的生命周期图

Fragment生命周期图

(1)onAttach()//当一个Fragment对象关联到一个Activity时调用。

(2)onCreate()//初始创建Fragment对象时调用。

(3)onCreateView()//创建与Fragment对象关联的View视图时调用。

(4)onActivityCreated()//Activity对象完成自己的onCreate方法时调用。

(5)、onStart()//Fragment对象在ui可见时调用。

(6)onResume()//Fragment对象的ui可以与用户交互时调用。

(7)onPause()//Fragment对象可见,但不可交互。有Activity对象转为onPause状态时调用。

(8)onStop()//有空间完全遮挡;或者宿主Activity对象转为onStop状态时调用。

(9)onDestroyView()//Fragment对象清理view资源时调用,也就是移除fragment中的视图。

(10)onDestroy()//Fragment对象完成对象清理View资源时调用。

(11)onDetach()//Fragment对象没有与Activity对象关联时调用。

当一个fragment被创建的时候执行1-4;

当这个fragment创建完毕,到对用户可见的时候,执行5-6;

当这个fragment从可见到不可见时,执行7-8;

当这个fragment被销毁了(或者持有它的activity被销毁了),执行9-11;

另外在3-5,可以使用Bundle对象保存一个fragment的对象。

对比图

生命周期分析

1. 当一个fragment被创建的时候,它会经历以下状态.

  • onAttach()
  • onCreate()
  • onCreateView()
  • onActivityCreated()

2. 当这个fragment对用户可见的时候,它会经历以下状态。

  • onStart()
  • onResume()

3. 当这个fragment进入“后台模式”的时候,它会经历以下状态。

  • onPause()
  • onStop()

4. 当这个fragment被销毁了(或者持有它的activity被销毁了),它会经历以下状态。

  • onPause()
  • onStop()
  • onDestroyView()
  • onDestroy() // 本来漏掉类这个回调,感谢xiangxue336提出。
  • onDetach()

5. 就像activitie一样,在以下的状态中,可以使用Bundle对象保存一个fragment的对象。

  • onCreate()
  • onCreateView()
  • onActivityCreated()

6. fragments的大部分状态都和activitie很相似,但fragment有一些新的状态。

  • onAttached() —— 当fragment被加入到activity时调用(在这个方法中可以获得所在的activity)。
  • onCreateView() —— 当activity要得到fragment的layout时,调用此方法,fragment在其中创建自己的layout(界面)。
  • onActivityCreated() —— 当activity的onCreated()方法返回后调用此方法
  • onDestroyView() —— 当fragment中的视图被移除的时候,调用这个方法。
  • onDetach() —— 当fragment和activity分离的时候,调用这个方法。

一旦activity进入resumed状态(也就是running状态),你就可以自由地添加和删除fragment了。因此,只有当activity在resumed状态时,fragment的生命周期才能独立的运转,其它时候是依赖于activity的生命周期变化的。

几点注意事项

1、 它在一个activity里面表示一个行为或者用户接口的一部分。

        我们可以将不同的Fragments组合起来放到一个activity中,或者在不同的activity中重用一个fragment。你可以将一个fragment看成是一个activity中的一个片段,它有自己的生命周期(如何从创建到销毁),接受它自己的输入事件,并且可以在activity运行时动态的添加或者移除一个fragment。

2、一个fragment必须总是绑定到一个activity中,虽然fragment有自己的生命周期,但同时也被它的宿主activity的生命周期直接影响。

        比如,当一个activity暂停的时候,它里面所有的fragments也同样暂停;当activity销毁的时候,它里面所有的fragment同样也被销毁;然而,当一个activity正在运行(它处于resumed生命周期的时候),我们可以独立的操纵每个fragment执行注入添加和移除它们;另外,当你执行一个fragment操作的时候,你可以将它添加到一个历史栈里面去,这个栈是由它的宿主activity维护,每一个栈里面的元素都是一个已经被执行过的fragment。这个堆栈可以让我们通过返回键来恢复之前的fragment。

3、ragment可以定义自己的布局文件(layout),当然其也可以没有自己的UI。

        当你将一个fragment作为activity的布局文件的一部分添加进去的时候,它就在activity的视图层次中的ViewGroup中。(1)可以通过在activity的layout中定义<fragment>元素来定义一个类中的fragment。(2)或者在代码中将其添加到当前的ViewGroup(视图组合,或者称为视图元素组合)中。注意:一个fragment并不一定要求是activity布局文件的一部分,我们也可以使用一个没有自己UI的fragment,作为一个activity不可见的一部分。

4、FragmentActivity的生命周期中最大的不同就是存储到后退栈中的过程。Activity是在停止时自动被系统压入停止栈,并且这个栈是被系统管理的;而fragment是被压入activity所管理的一个后退栈,并且只有你在删除fragment后并明确调用addToBackStack()方法时才被压入。

抱歉!评论已关闭.