Activity、Fragment和Surface的生命周期

article/2025/11/3 15:31:46

这里首先推荐大家一本Android的学习书籍:《第一行代码》,这本书还是写得非常好的。好了,进入正题,我们先来了解一下Activity、Fragment的的生命周期中经历的几个阶段。

ActivityFragment
5462305-192b502e265688a5.png
5462305-0b175de7452cba4e.png

下面我们假设有如下的场景,Activity内部有一个Fragment,Fragment内部是一个SurfaceView。
分为两种情况,一种是在资源文件直接加载Fragment标签,例如:

<Fragmentandroid:name="com.myapplication.MainFragment"android:id="@+id/main_content"android:layout_width="match_parent"android:layout_height="match_parent" />

另一种是动态加载Fragment,先在资源文件定义存放Fragment的容器,然后通过FragmentTransaction:add()FragmentTransaction:commit()函数创建并加载,例如:

<FrameLayoutandroid:id="@+id/main_content"android:layout_width="match_parent"android:layout_height="match_parent" />

测试代码如下:

Activity

public class MainActivity extends AppCompatActivity implements  {private MainFragment mMainFragment;@Overrideprotected void onCreate(Bundle savedInstanceState) {LogUtils.init(0, ILog.LEVEL_INFO, "magnity", null);LogUtils.i("activity onCreate enter");super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mMainFragment = (MainFragment)getSupportFragmentManager().findFragmentById(R.id.main_content);if (mMainFragment == null) {mMainFragment = MainFragment.newInstance();getSupportFragmentManager().beginTransaction().add(R.id.main_content, mMainFragment).commit();} LogUtils.i("activity onCreate leave");}@Overrideprotected void onStart() {LogUtils.i("activity onStart enter");super.onStart();LogUtils.i("activity onStart leave");}@Overrideprotected void onResume() {LogUtils.i("activity onResume enter");super.onResume();LogUtils.i("activity onResume leave");}@Overrideprotected void onPause() {LogUtils.i("activity onPause enter");super.onPause();LogUtils.i("activity onPause leave");}@Overrideprotected void onStop() {LogUtils.i("activity onStop enter");super.onStop();LogUtils.i("activity onStop leave");}@Overrideprotected void onDestroy() {LogUtils.i("activity onDestroy enter");super.onDestroy();LogUtils.i("activity onDestroy leave");}
}

Fragment

public class MainFragment extends Fragment {public MainFragment() {// Required empty public constructor}public static MainFragment newInstance(String param1, String param2) {MainFragment fragment = new MainFragment();return fragment;}@Overridepublic void onCreate(Bundle savedInstanceState) {LogUtils.i("fragment onCreate enter");super.onCreate(savedInstanceState);LogUtils.i("fragment onCreate leave");}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {LogUtils.i("fragment onCreateView enter");View v = inflater.inflate(R.layout.fragment_main, container, false);LogUtils.i("fragment onCreateView leave");return v;}@Overridepublic void onAttach(Context context) {LogUtils.i("fragment onAttach enter");super.onAttach(context);LogUtils.i("fragment onAttach leave");}@Overridepublic void onActivityCreated(@Nullable Bundle savedInstanceState) {LogUtils.i("fragment onActivityCreated enter");super.onActivityCreated(savedInstanceState);LogUtils.i("fragment onActivityCreated leave");}@Overridepublic void onStart() {LogUtils.i("fragment onStart enter");super.onStart();LogUtils.i("fragment onStart leave");}@Overridepublic void onResume() {LogUtils.i("fragment onResume enter");super.onResume();LogUtils.i("fragment onResume leave");}@Overridepublic void onPause() {LogUtils.i("fragment onPause enter");super.onPause();LogUtils.i("fragment onPause leave");}@Overridepublic void onStop() {LogUtils.i("fragment onStop enter");super.onStop();LogUtils.i("fragment onStop leave");}@Overridepublic void onDestroyView() {LogUtils.i("fragment onDestroyView enter");super.onDestroyView();LogUtils.i("fragment onDestroyView leave");}@Overridepublic void onDestroy() {LogUtils.i("fragment onDestroy enter");super.onDestroy();LogUtils.i("fragment onDestroy leave");}@Overridepublic void onDetach() {LogUtils.i("fragment onDetach enter");super.onDetach();mListener = null;LogUtils.i("fragment onDetach leave");}
}

SurfaceView

public class MainSurfaceView extends SurfaceView implements SurfaceHolder.Callback {public MainSurfaceView(Context context, AttributeSet attrs) {super(context, attrs);getHolder().addCallback(this);}@Overridepublic void surfaceCreated(SurfaceHolder holder) {LogUtils.i("surface surfaceCreated");}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {LogUtils.i("surface surfaceChanged");}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {LogUtils.i("surface surfaceDestroyed");}
}

打印结果

  1. 动态加载
    启动应用并加载MainActivity,打印如下:

activity onCreate enter
activity onCreate leave
activity onStart enter
fragment onAttach enter
fragment onAttach leave
fragment onCreate enter
fragment onCreate leave
fragment onCreateView enter
fragment onCreateView leave
fragment onActivityCreated enter
fragment onActivityCreated leave
fragment onStart enter
fragment onStart leave
activity onStart leave
activity onResume enter
activity onResume leave
fragment onResume enter
fragment onResume leave
surface surfaceCreated
surface surfaceChanged

按HOME键切到后台,打印如下:

activity onPause enter
fragment onPause enter
fragment onPause leave
activity onPause leave
surface surfaceDestroyed
activity onStop enter
fragment onStop enter
fragment onStop leave
activity onStop leave

恢复到前台,打印如下:

activity onStart enter
fragment onStart enter
fragment onStart leave
activity onStart leave
activity onResume enter
activity onResume leave
fragment onResume enter
fragment onResume leave
surface surfaceCreated
surface surfaceChanged

退出MainActivity,打印如下:

activity onPause enter
fragment onPause enter
fragment onPause leave
activity onPause leave
surface surfaceDestroyed
activity onStop enter
fragment onStop enter
fragment onStop leave
activity onStop leave
activity onDestroy enter
fragment onDestroyView enter
fragment onDestroyView leave
fragment onDestroy enter
fragment onDestroy leave
fragment onDetach enter
fragment onDetach leave
activity onDestroy leave

  1. 静态加载
    启动应用并加载MainActivity,打印如下:

activity onCreate enter
fragment onAttach enter
fragment onAttach leave
fragment onCreate enter
fragment onCreate leave
fragment onCreateView enter
fragment onCreateView leave
activity onCreate leave
activity onStart enter
fragment onActivityCreated enter
fragment onActivityCreated leave
fragment onStart enter
fragment onStart leave
activity onStart leave
activity onResume enter
activity onResume leave
fragment onResume enter
fragment onResume leave
surface surfaceCreated
surface surfaceChanged

按HOME键切到后台,打印如下:

activity onPause enter
fragment onPause enter
fragment onPause leave
activity onPause leave
surface surfaceDestroyed
activity onStop enter
fragment onStop enter
fragment onStop leave
activity onStop leave

恢复到前台,打印如下:

activity onStart enter
fragment onStart enter
fragment onStart leave
activity onStart leave
activity onResume enter
activity onResume leave
fragment onResume enter
fragment onResume leave
surface surfaceCreated
surface surfaceChanged

退出MainActivity,打印如下:

activity onPause enter
fragment onPause enter
fragment onPause leave
activity onPause leave
surface surfaceDestroyed
activity onStop enter
fragment onStop enter
fragment onStop leave
activity onStop leave
activity onDestroy enter
fragment onDestroyView enter
fragment onDestroyView leave
fragment onDestroy enter
fragment onDestroy leave
fragment onDetach enter
fragment onDetach leave
activity onDestroy leave

总结

可以看到Activity在动态加载和静态加载时,Fragment的回调函数的调用顺序略有差别,但也有规律可循,而在Activity退出时其调用顺序则完全一致。了解这些回调函数的调用顺序有助于我们开发更具健壮性的程序。


http://chatgpt.dhexx.cn/article/tArHMEPy.shtml

相关文章

Java进度条

转自&#xff1a;点击打开链接 进度条用在很多的地方&#xff0c;比如登录验证等待过程、程序加载、数据下载、数据更新与删除等&#xff0c;它可以一目了然的让用户知道程序执行的进度。下面给大家看一个登录验证的进度条&#xff0c;首先上效果图&#xff1a; 在代码中未连接…

java窗口进度条_java进度条窗口具体如何制作?

可视化窗口是大部分游戏的常态&#xff0c;今天我们就来了解下如何编写进度条窗口&#xff0c;快跟小编一起看看吧。 一、在包右击new->other->WindowBuilder->JFrame->name叫Guithreadpackage guithread; import java.awt.BorderLayout; import java.awt.EventQue…

java进度条_「java进度条」Java JProgressBar类(进度条) - seo实验室

java进度条 简介 利用JprogressBar类可以实现一个进度条。它一般是一种颜色部分或完全填充的矩形。缺省情况下,进度条配备了一个凹陷的边框,并水平放置。 进度条还可以选择显示一个字符串,这个字符串在进度条矩形的中央位置上显示。这个字符串缺省时为耗时任务已完成的百分比…

Java 进度条

效果 代码 思路&#xff1a;使用NumberFormat类来格式化数字&#xff0c;显示完后&#xff0c;退格覆盖重新显示新的数字 import java.text.NumberFormat;public class Test {public static void main(String[] args) throws Exception {System.out.print("Progress:"…

Java图形化界面---进度条

目录 一、进度条的介绍 二、创建进度条 三、简单案例 四、子线程创建进度条 &#xff08;1&#xff09;为什么要使用子线程创建进度条 &#xff08;2&#xff09;子线程创建进度条的代码 五、创建进度对话框 &#xff08;1&#xff09;如何创建进度对话框 &#xff08;2&…

Java图形化界面编程超详细知识点(7)——进度条

目录 4 JProgressBar、ProgressMonitor、BoundedRangeModel实现进度条 4.1 创建进度条 4 JProgressBar、ProgressMonitor、BoundedRangeModel实现进度条 进度条是图形界面中广泛使用的GUI组件&#xff0c;当复制一个较大的文件时&#xff0c;操作系统会显示一个进度条&#…

Java制作进度条

【效果图】 【描述】 进度条宽度保持和窗口宽度一致&#xff0c;进度最小值为0&#xff0c;最大值为100&#xff0c;每100毫秒进度值1&#xff0c;进度条中间显示进度百分比 【代码】 package test;import java.awt.*; import java.awt.event.*;import javax.swing.*;public…

QT:QGraphicsScene与QGraphicsView使用render()函数渲染图片

render()函数看官方文档&#xff0c;会有很多不懂得地方&#xff0c;以下为实践出来的效果。 当我们想要用QPaint() 绘制我们在QGraphicsView看到的部分时&#xff0c;不仅要绘制正确的图片大小&#xff0c;还需要使用 render() 渲染正确的大小。当我们只想要绘制坐标系中矩形…

Qt图形特效:QGraphicsOpacityEffect

一、描述 不透明度效果使源具有不透明度。该效果对于使源半透明非常有用&#xff0c;类似于淡入/淡出序列。可以使用setOpacity()函数修改不透明度。 二、属性成员 1、opacity : qreal。此属性保存不透明度。该值应在0.0到1.0的范围内&#xff0c;其中0.0是完全透明的&#…

图形视图(02):【类】QGraphicsScene [官翻]

文章目录 详述事件处理和传播 公共类型enum ItemIndexMethodenum SceneLayer 属性backgroundBrush: QBrushbspTreeDepth: intfocusOnTouch: boolfont: QFontforegroundBrush: QBrushitemIndexMethod: ItemIndexMethodminimumRenderSize: qrealpalette: QPalette**sceneRect**: …

Qt中使用QGraphicsScene重写drawBackGround绘制背景

Qt中使用QGraphicsScene重写drawBackGround绘制背景 需求解释 我是想这学习Qt的界面设计&#xff0c;希望能够对界面背景进行优化然后使用Qt的界面与图形画背景网格。首先查资料 通过查找博客发现很简单&#xff0c;就是新建一个类继承于QGraphicsScene&#xff0c;于是我就…

图形视图框架QGraphicsScene(场景,概念)

QGraphicsScene 该类充当 QGraphicsItems 的容器。它与 QGraphicsView 一起使用&#xff0c;用于在 2D 表面上可视化图形项目&#xff0c;例如线条、矩形、文本甚至自定义项目。 QGraphicsScene具有的功能&#xff1a; 提供用管理大量数据项的高速接口传播事件到每一个图形项…

qt学习笔记(五) QGraphicsPixmapItem与QGraphicsScene的编程实例 图标拖动渐变效果

应大家的要求&#xff0c;还是把完整的工程文件贴出来&#xff0c;大家省点事&#xff1a;http://www.kuaipan.cn/file/id_48923272389086450.htm 先看看运行效果&#xff0c;我用的群创7寸屏&#xff0c;主机是mini2440&#xff0c;分辨率是800*480&#xff0c;程序写比较粗糙…

Qt QGraphicsScene、QGraphicsView类实现仪表盘

Qt QGraphicsScene、QGraphicsView类实现仪表盘 【1】UI界面设计【2】效果【3】QGraphicsScene简介【4】QGraphicsEllipseItem简介【5】QGraphicsPolygonItem简介【6】QGraphicsLineItem简介【7】QGraphicsView简介【8】仪表源码头文件源码 【1】UI界面设计 【2】效果 【3】QGr…

qt QGraphicsScene 简单例子

坐标 graphicsView是Widget这个界面的子控件&#xff0c; 他的位置是左上角坐标为&#xff08;30,30&#xff09; 他的宽度为431&#xff0c;高度为431. 如果在graphicsView 这个子控件中&#xff0c; 继续加入 子控件A&#xff0c;由于graphicsView比较特殊。 根据它的align…

QGraphicsScene设置SceneRect

简要说明 QGraphicsScene场景区域&#xff0c;可在构造QGraphicsScene对象时设定&#xff0c;也可通过函数setSceneRect设定。QGraphicsScene场景区域中坐标原点的位置&#xff0c;会影响到图形项的坐标设定&#xff0c;进而影响图形项在场景中的显示位置。以将图片显示在中心…

QT QGraphicsScene / QGraphicsView中 sceneRect 使用详细说明

接触QT不久&#xff0c;发现QT的Graphics View框架坐标使用和平常不一样&#xff0c;尤其sceneRect的作用。 官方文档关于这部分介绍真是蛋疼&#xff0c;网上说的也寥寥。没法自己研究了一下&#xff0c;其实这块内容QT设计的很方便&#xff0c;只是文档讲解的太烂&#xff0c…

【QT】GraphicsView、QGraphicsScene、QGraphicsEllipseItem的使用

GraphicsView、QGraphicsScene、QGraphicsEllipseItem的使用 前言实验目的重构GraphicsView类新建GraphicsView、QGraphicsScene层绘制Item图形控件绘制圆形绘制矩形绘制三角形绘制文字绘制直线 组合、打散、前置和后置组合打散控件前置控件后置 绑定功能事件总结 前言 对于绘…

Qt 绘图之QGraphicsScene QGraphicsView QGraphicsItem详解

Graphics View提供了一个界面&#xff0c;它既可以管理大数量的定制2D graphical items&#xff0c;又可与它们交互&#xff0c;有一个view widget可以把这些项绘制出来&#xff0c;并支持旋转与缩放。这个柜架也包含一个事件传播结构&#xff0c;对于在scene中的这些items,它具…

PyQt5:QGraphicsScene入门一:基本介绍、场景定义、添加元素

为什么80%的码农都做不了架构师?>>> 简介说明: 这个QGraphicsScene类用于在场景中操作大量的2D图形元素,这个类是作为一个容器QGraphicsItems存在的,它是连同QGraphicsView用于可视化的二维表面的图形项目,如直线,矩形,文本,甚至定制物品;还可以有效地…