文章目录

  • 前言
  • 一、Fragment生命周期概述
    • 启动
    • 退出
  • 二、Fragment生命周期细述
    • 1.onCreate(Bundle)
    • 2.onCreateView(LayoutInflater, ViewGroup, Bundle)
    • 3.onStart()
    • 4.onResume()
    • 5.onPause()
    • 6.onStop()
    • 7.onDestroy():
    • 8.onSaveInstanceState(Bundle):
  • 总结

前言

本文记录笔者学习Fragment生命周期的心路历程

一、Fragment生命周期概述

在这一部分中,我们单纯以Fragment为观察对象,观察其生命周期
在Android开发平台的官方文档中,对Fragment的生命周期有如下的描述

尽管 Fragment 的生命周期与其拥有的活动相关联,但它在标准活动生命周期上也有自己的缺陷。它包括基本的活动生命周期方法,例如onResume(),但与活动交互和 UI 生成相关的方法也很重要。

Fragment(与用户交互)的一系列核心生命周期方法是:

  • onAttach(Activity)一旦Fragment与其活动相关联时调用。
  • onCreate(Bundle)调用以进行Fragment的初始创建。
  • onCreateView(LayoutInflater, ViewGroup, Bundle)创建并返回与片段关联的视图层次结构。
  • onActivityCreated(Bundle)告诉Fragment它的活动已经完成了它自己的Activity.onCreate().
  • onViewStateRestored(Bundle)告诉Fragment其视图层次结构的所有已保存状态都已恢复。
  • onStart()使片段对用户可见(基于其包含的活动正在启动)。
  • onResume()使片段开始与用户交互(基于其包含的活动被恢复)。

当一个Fragment不再被使用时,它会经历一系列反向回调:

  • onPause()片段不再与用户交互,因为它的活动被暂停或片段操作正在活动中修改它。
  • onStop()片段不再对用户可见,因为它的活动正在停止或片段操作正在活动中修改它。
  • onDestroyView()允许片段清理与其视图关联的资源。
  • onDestroy()调用以对片段的状态进行最终清理。
  • onDetach()在片段不再与其活动相关联之前立即调用。

放一张目前网上能找到的相对完整的生命周期如下
(相对完整),因为看过Google最新关于Fragment生命周期描述的uu就应该知道这篇生命周期的描述是不完整的,但是大体思路可以看看

这里给出如下案例进行阐述

启动

onAttach() -------> onCreate() [Fragment]-------> onCreateView() ------>onCreate()[Activity]->onActivityCreated->onViewCreated() -----> onStart()-------> onStart()(Activity) -------->onResume()(Activity) --------> onResume()

退出

onPause[Activity]->onPause[Fragment]->onStop[Activity]->onStop[Fragment]->onDestroy[Activity]->onDestroyView[Fragment]->onDestroy[Fragment]->onDetach[Fragment]

二、Fragment生命周期细述

1.onCreate(Bundle)

我们一般使用Fragment的无参构造函数,尽管我们可以通过自己定义书写Fragment的有参构造函数,但是这样做很容易导致不可预见的bug

当Activity被强制销毁,之后又被自动恢复的时候,Android系统会在这一过程中销毁并重新创建Fragment。
重新创建的机制是通过使用反射的方法来调用Fragment的无参构造函数来实现的。
因此,如果您是使用带参数的构造函数来实例化Fragment,并在其中将依赖的对象传递给它,那么在保存和恢复后,所有这些依赖的对象都将被设置为null。
因此,就像Activity一样,您需要使用onCreate(Bundle)方法作为构造函数的替代者。
Fragment中依赖对象的注入和初始化就发生在这里。

Fragment相关逻辑源码如下:

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);getInjector().inject(this); // inject dependenciesif (savedInstanceState != null) {mWelcomeDialogHasAlreadyBeenShown = savedInstanceState.getBoolean(SAVED_STATE_WELCOME_DIALOG_SHOWN);}mActivityAsListener = (ActivityAsListener) requireActivity();}

2.onCreateView(LayoutInflater, ViewGroup, Bundle)

看到这个方法,大多数人都会有疑惑的地方就是,为何Fragment不像Activity那样在onCreate()方法中初始化View呢,这里引用另外一位博主的解释

Activity在生命周期的转换过程中都只有同一个View hierarchy。 你在Activity的onCreate(Bundle)中初始化这个View hierarchy,然后它就会一直存在于Activity的整个生命周期,直到Activity被垃圾收集器回收为止。 您可以手动更改Activity的View hierarchy的组成,Android系统是不会为您做任何事情的。

然而,Fragment在其生命周期中可以存在有多个View hierarchy,由Android系统决定何时进行替换。
换句话说,你可以在程序运行的时候动态改变Fragment的View hierarchy,现在你应该清楚为什么不能在Fragment的onCreate(Bundle)中操作View了吧。 onCreate(Bundle)方法在Fragment被Attach到Activity后仅被调用一次,它无法支持Fragment的View hierarchy的动态化。

每次需要创建新的View hierarchy的时候,Android系统都会调用onCreateView(LayoutInflater, ViewGroup, Bundle)方法。 您的工作是创建View hierarchy并将其初始化为正确的状态,然后将它作为该方法的返回值,之后它就会被Android系统接管。

重写这个方法的主要原则是:Fragment中所有持有与View hierarchy相关的对象的引用的成员变量,必须在View onCreateView(LayoutInflater,ViewGroup,Bundle)中进行初始化。 换句话说,如果Fragment的成员变量持有View或者相关对象的引用,请确保在此方法中初始化这些成员变量,这非常重要。

换句话说,onCreateView()存在的意义就是使得Fragment可以动态改变其View hierarchy

3.onStart()

参照Activity的onStart()方法

4.onResume()

参照Activity

5.onPause()

参照Activity的onPause()方法

6.onStop()

这个方法的处理逻辑同样与Activity的onStop()方法相同。其基本的处理逻辑如下所示:

相关源码如下

@Override
public void onStop() {super.onStop();mSomeView.setOnClickListener(null);mFirstDependency.unregisterListener(this);
}

在这里需要完成两件事
1.取消Activity的相关注册
2.取消点击事件

之所以这样做,可以参照以下的解释

1:

如果在onPause()方法里调用mFirstDependency.unregisterListener(this),那么Activity将不会收到相关异步流程完成的通知。因此,它不能让用户感知到这一事件,从而完全违背了多窗口模式的设计初衷,这不是一种好的处理方式。
如果在onDestroy()方法里调用mFirstDependency.unregisterListener(this),这同样不是一种好的处理方式。
当应用被用户推到后台(例如,点击“home”按钮)时,Activity的onStop()将被调用,从而使得其返回到“已创建”状态,这个Activity可以在几天甚至几周的时间内保持这个状态。
如果这时候mFirstDependency产生了连续的事件流,那么在这几天甚至几周的时间里,Activity可以都处理这些事件,即使用户在这段时间内从未真正与它交互过。这将是对用户电池寿命的不负责任的浪费,而且在这种情况下,应用消耗的内存会逐渐增多,应用进程被OOM(Out
Of Memory)Killer杀死的可能性也会增大。
因此,在onPause()和onDestroy()里调用mFirstDependency.unregisterListener(this)都不是一种好的处理方式,您应该在onStop()中执行此操作。

2:
关于2的解释,主要是用户使用APP的连续性和解决Activity停止后事件仍然进行分发的结果

7.onDestroy():

不需要覆盖重写这个方法,这个方法完全只是相关资源的回收

8.onSaveInstanceState(Bundle):

此方法用于保存一些临时的状态,在这个方法里你位移需要做的就是将你想保存的状态存入Bundle数据结构中:

@Override
public void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);outState.putBoolean(SAVED_STATE_WELCOME_DIALOG_SHOWN, mWelcomeDialogHasAlreadyBeenShown);
}

在这里,有个陷阱,如果你在这个方法执行完之后,提交Fragment事务,那么应用程序会抛出IllegalStateException异常而导致崩溃。
你需要知道的一点是onSaveInstanceState(Bundle)将在onStop()之前被调用。
好消息是,经过多年的努力,谷歌终于意识到了这个bug。 在新版本的Android中,==onStop()将在onSaveInstanceState(Bundle)==之前被调用。

总结

以上就是Fragment生命周期的分享和整理

Android:Fragment生命周期(结合Activity的生命周期进行分析)相关推荐

  1. Android学习之详解Activity的生命周期

    Activity Activity作为Android的四大组件之一,可见其地位非同寻常,官网介绍: 移动应用体验与桌面体验的不同之处在于,用户与应用的互动并不总是在同一位置开始,而是经常以不确定的方式 ...

  2. android 弹窗 onpause,Android 下拉通知栏时Activity的生命周期——重新理解onPause()

    下拉通知栏时发生了什么 在某个APP中,发现下拉通知栏的时候,正在播放的视频会暂停,于是有点好奇这段操作是不是在生命周期中实现的.在网上众多关于Activity生命周期的讨论中,很多人认为onPaus ...

  3. android 横竖屏切换时候activity的生命周期,横竖屏切换时候Activity的生命周期

    minifest中的设置如下:screenOrientation设置为"sensor". 本人使用的是Android7.0版本 1.新建一个Activity,并把各个生命周期打印出 ...

  4. Android Fragment跳转到Activity的方法

    一开始我直接按照Activity页面之间跳转的方法进行的跳转,就是在xml文件中给相应的组件onClick android:onClick="to_search" 在网上查询到的好 ...

  5. Android入门(五) | Activity 的生命周期

    文章目录 Activity 的状态及生命周期 实现管理生命周期 FirstActivity SecondActivity DialogActivity 运行结果 旧活动被回收了还能返回吗? Activ ...

  6. android fragment生命周期图,Fragment生命周期详解

    序言 Fragment从Android v3.0版本开始引入的,随着界面布局的复杂化,处理起来也更加的复杂,引入Fragment可以把Activity拆分成多个部分.一个Activity可以同时组合多 ...

  7. android生命周期方法,Android零基础入门|Activity状态和生命周期方法

    原标题:Android零基础入门|Activity状态和生命周期方法 前面两期我们学习了Activity的创建和注册.以及启动和关闭,也学会了重写onCraete方法,这些知识在实际开发中远远不够,还 ...

  8. activity 生命周期_从0系统学Android-2.4 Activity 的生命周期

    本系列文章,参考<第一行代码>,作为个人笔记 更多内容:更多精品文章分类 本系列持续更新中-. 2.4 Activity 的生命周期 掌握 Activity 的生命周期对于开发者来说是非常 ...

  9. 什么是生命周期?Activity生命周期的三种状态

    什么是生命周期 生命周期就是一个对象从创建到销毁的过程,每一个对象都有自己的生命周期.同样,Activity也具有相应的生命周期,Activity的生命周期中分为三种状态,分别是运行状态.暂停状态和停 ...

  10. android fragment activity 交互,Android基础之Fragment与Activity交互详解

    今天继续讲解Fragment组件的特性,主要是跟Activity的交互和生命周期的关系,我们前面已经说过Fragment是依赖于Activity的,而且生命周期也跟Activity绑定一起.下面我们看 ...

最新文章

  1. 建议给予导师决定硕博士能否毕业的自主权?教育部:将充分采纳!
  2. 【树形DP】树的重心详解+多组例题详解
  3. ISME:多组学揭示低氧环境下的汞甲基化细菌
  4. MySQL快速入门指南
  5. Lambda 表达式到底有何用处?如何使用?
  6. c语言ascii码表数字,求教!我想显示数字但是现在显示的却是数字在ASCII码中对应的符...
  7. 树莓派删除python2.7设置python3.5
  8. TensorflowSharp 简单使用与KNN识别MNIST流程
  9. 执行文件异常报错:ImportError: attempted relative import with no known parent package
  10. Linux的远程登陆
  11. Machine Learning - IV. Linear Regression with Multiple Variables多变量线性规划 (Week 2)
  12. python定时启动任务_python--实现定时任务
  13. 【AD封装】电感(带3D)
  14. 数据库时间慢了14个小时,Mybatis说,这个锅我不背~
  15. windows7到底是多用户多任务操作系统还是单用户多任务操作系统
  16. GAMES101课程学习笔记—Lec 02:Linear Algebra 线性代数回顾
  17. PDMS插件_三维地形工具
  18. mac备忘录 英文引号自动转中文引号
  19. 梳理PSS和SSS的位置
  20. 大象的三个武器——浅谈印象笔记的“笔记本分类”、“搜索”、“标签”的应用...

热门文章

  1. yml格式或者叫做YAML格式数据学习
  2. Anaconda安装Karas
  3. 微信点击链接直接下载安装包功能实现方式
  4. swift 时间时间戳获取及相互转换
  5. 基于PaddleOCR识别火车票信息
  6. 【精】iOS知识树,知识点(包括对象、Block、消息转发、GCD、运行时、runloop、动画、Push、KVO、tableview,UIViewController、提交AppStore)
  7. 你到底要一台什么样的笔记本
  8. 重装系统后开机黑屏显示cannot load file怎么办
  9. 漫画电子电路读书笔记
  10. 从重大漏洞应急看云原生架构下的安全建设与安全运营(下)