Android:Fragment生命周期(结合Activity的生命周期进行分析)
文章目录
- 前言
- 一、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的生命周期进行分析)相关推荐
- Android学习之详解Activity的生命周期
Activity Activity作为Android的四大组件之一,可见其地位非同寻常,官网介绍: 移动应用体验与桌面体验的不同之处在于,用户与应用的互动并不总是在同一位置开始,而是经常以不确定的方式 ...
- android 弹窗 onpause,Android 下拉通知栏时Activity的生命周期——重新理解onPause()
下拉通知栏时发生了什么 在某个APP中,发现下拉通知栏的时候,正在播放的视频会暂停,于是有点好奇这段操作是不是在生命周期中实现的.在网上众多关于Activity生命周期的讨论中,很多人认为onPaus ...
- android 横竖屏切换时候activity的生命周期,横竖屏切换时候Activity的生命周期
minifest中的设置如下:screenOrientation设置为"sensor". 本人使用的是Android7.0版本 1.新建一个Activity,并把各个生命周期打印出 ...
- Android Fragment跳转到Activity的方法
一开始我直接按照Activity页面之间跳转的方法进行的跳转,就是在xml文件中给相应的组件onClick android:onClick="to_search" 在网上查询到的好 ...
- Android入门(五) | Activity 的生命周期
文章目录 Activity 的状态及生命周期 实现管理生命周期 FirstActivity SecondActivity DialogActivity 运行结果 旧活动被回收了还能返回吗? Activ ...
- android fragment生命周期图,Fragment生命周期详解
序言 Fragment从Android v3.0版本开始引入的,随着界面布局的复杂化,处理起来也更加的复杂,引入Fragment可以把Activity拆分成多个部分.一个Activity可以同时组合多 ...
- android生命周期方法,Android零基础入门|Activity状态和生命周期方法
原标题:Android零基础入门|Activity状态和生命周期方法 前面两期我们学习了Activity的创建和注册.以及启动和关闭,也学会了重写onCraete方法,这些知识在实际开发中远远不够,还 ...
- activity 生命周期_从0系统学Android-2.4 Activity 的生命周期
本系列文章,参考<第一行代码>,作为个人笔记 更多内容:更多精品文章分类 本系列持续更新中-. 2.4 Activity 的生命周期 掌握 Activity 的生命周期对于开发者来说是非常 ...
- 什么是生命周期?Activity生命周期的三种状态
什么是生命周期 生命周期就是一个对象从创建到销毁的过程,每一个对象都有自己的生命周期.同样,Activity也具有相应的生命周期,Activity的生命周期中分为三种状态,分别是运行状态.暂停状态和停 ...
- android fragment activity 交互,Android基础之Fragment与Activity交互详解
今天继续讲解Fragment组件的特性,主要是跟Activity的交互和生命周期的关系,我们前面已经说过Fragment是依赖于Activity的,而且生命周期也跟Activity绑定一起.下面我们看 ...
最新文章
- 建议给予导师决定硕博士能否毕业的自主权?教育部:将充分采纳!
- 【树形DP】树的重心详解+多组例题详解
- ISME:多组学揭示低氧环境下的汞甲基化细菌
- MySQL快速入门指南
- Lambda 表达式到底有何用处?如何使用?
- c语言ascii码表数字,求教!我想显示数字但是现在显示的却是数字在ASCII码中对应的符...
- 树莓派删除python2.7设置python3.5
- TensorflowSharp 简单使用与KNN识别MNIST流程
- 执行文件异常报错:ImportError: attempted relative import with no known parent package
- Linux的远程登陆
- Machine Learning - IV. Linear Regression with Multiple Variables多变量线性规划 (Week 2)
- python定时启动任务_python--实现定时任务
- 【AD封装】电感(带3D)
- 数据库时间慢了14个小时,Mybatis说,这个锅我不背~
- windows7到底是多用户多任务操作系统还是单用户多任务操作系统
- GAMES101课程学习笔记—Lec 02:Linear Algebra 线性代数回顾
- PDMS插件_三维地形工具
- mac备忘录 英文引号自动转中文引号
- 梳理PSS和SSS的位置
- 大象的三个武器——浅谈印象笔记的“笔记本分类”、“搜索”、“标签”的应用...