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

Activity Fragment

下面我们假设有如下的场景,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退出时其调用顺序则完全一致。了解这些回调函数的调用顺序有助于我们开发更具健壮性的程序。

Activity、Fragment和Surface的生命周期相关推荐

  1. 3.1 Fragment理论知识及其生命周期,看这一片就够了

    点此进入:从零快速构建APP系列目录导图 点此进入:UI编程系列目录导图 点此进入:四大组件系列目录导图 点此进入:数据网络和线程系列目录导图 一.Fragment 是什么? Fragment 是一种 ...

  2. 史上最全Fragment介绍,包括fragment的定义,生命周期,用法

    一.为什么要使用Fragment 1.当我们需要动态的多界面切换的时候,就需要将UI元素和Activity融合成一个模块.在2.3中我们一般通过各种Activity中进行跳转来实现多界面的跳转和单个界 ...

  3. Android按键响应的几种方式、安卓页面的跳转、页面跳转传参、页面自动跳转、Activity(页面)的生命周期

    按键响应的第一种方式: 在XML文件里面设置按键的onClick绑定函数.就像下面的代码,给Button设置onClick属性,在按键被按下的时候,会调用java文件里面的onClickbtton1这 ...

  4. Activity启动另一个Activity并返回的完整生命周期

    Android的简单基本问题,这里记录一下 从一个Activity创建后启动另一个Activity并返回的完整log输出: 从log可以看出,当前Activity启动另一个Activity时,总是要等 ...

  5. Activity详解Activity的使用步骤、生命周期及其启动模式、启动方法

    开始我们先来回顾一下Activity的基础知识: Activity是应用程序的表现层,应用程序中可以包含多个Activity,它们之间可以相互跳转,来达到手机屏幕的切换.Activity通过View来 ...

  6. AndroidStudio安卓原生开发_Activity_生命周期_单activity的生命周期_多activity启动关闭的时候生命周期关系---Android原生开发工作笔记85

    暂时不写内容,后边补上,因为工作太忙,先把图,以及重要的难点说明写出来,后边会修改成详细的文章

  7. Lifecycle Activity和Fragment生命周期感知组件 LifecycleObserver MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  8. android gilde生命周期管理,Glide原理之Activity、Fragment生命周期监听(三)

    Glide中一个重要特性是Request可以随Activity或Fragment的onStart而resume,onStop而pause,onDestroy而clear,从而节约流量和内存,并且防止内 ...

  9. 友盟页面统计 - 关于Viewpager中的Fragment的生命周期

    Activity和Fragment各自理论上的生命周期 Activity的生命周期是较为经典也最清晰的,在此不表: Fragment从出现到广泛运用也有一段时间了,其标准生命周期也仅比Activity ...

最新文章

  1. 程序员千万不要选全栈开发
  2. 实现跨浏览器的HTML5占位符
  3. C#中抽象类和接口的区别与使用
  4. 通过/proc/sys/net/ipv4/优化Linux下网络性能
  5. python 分词工具训练_中文分词入门和分词工具汇总攻略
  6. Pytorch实战1:线性回归(Linear Regresion)
  7. Intel 64 and IA-32 Architectures Instruction Format 指令格式
  8. 8分钟答辩稿_教资面试!各科试讲逐字稿!背就稳了!
  9. Android 动态移动控件实现
  10. 超市也开始玩“内卷”?
  11. java零基础从入门到精通(全)
  12. CAN通讯与RS485通讯区别
  13. 《吴忠与富富平》之一:秦统一前后的吴忠及秦汉对吴忠地区的开发
  14. 微积分(七)——一元函数积分学
  15. 马斯克11天强吞推特,全新商业帝国拼图完成
  16. 如何使用AndriodStudio制作音乐播放器音乐列表界面和导入手机音乐资源
  17. 基于CAT12的report数据做QC质量检查,排除离群点——IQR欧拉数
  18. iOS APP版本自动更新
  19. 人脸识别中怎么区分人脸和照片
  20. 低合金Q355D材料中的机械性能名称

热门文章

  1. 使用geocoder_你在哪? 使用Geocoder PHP实现地理位置
  2. 期市财盛:9月18日恒指/黄金/原油行情交易及布局
  3. python将.npy文件转化为为图片格式
  4. 将Gitbook上的书籍发布在GitHubPages上
  5. 基于Kubernetes的微服务自动化运维
  6. 计算机网络总复习(谢希仁第七版)
  7. xcode 4 制作静态库详解
  8. ACPL-336J光耦隔离驱动应用笔记
  9. Secure CRT中文乱码解决方法
  10. SpringMVC的两个蝴蝶飞你好的简单开发(二)