前言
以前学习的Android知识杂乱无章,形成不了一个完整的知识体系,因此打算根据知识星球的内容,完整的过一遍,首先来学习一下Activity。Activity是Android四大组件中最为重要的一个,负责直接与用户交互,先来看看Activity的生命周期
一、生命周期
官方文档给出了下面这个图

onCreate(Bundle)是Activity中除了attachBaseContext以外的第一个回调方法,该方法一般用于调用setContentViewonStart()当Activity可见时回调,注意可见不代表Activity的UI被显示出来,因为View的三大流程需要在onResume回调完后才会开始onResume()当Activity获得了焦点后回调(开始可以与用户交互),同样的,Activity的UI也没被显示出来,因此在该方法中直接获取View的宽高拿到的都是0,回调完该方法Activity就处于运行状态了onPause()当Activity失去了焦点后回调,该方法后面可能会调用onStop、onResume或者可能被系统杀死onStop()当Activity不可见时回调,该方法后面可能会调用onDestory、onRestart或者可能被系统杀死onRestart()当Activity处于stop状态后,又被切换到的前台时回调,该方法后面紧跟着onStart回调onDestroy()当Activity将要被销毁后调用,可能的情况是finish方法被调用或者配置改变时(没有配置configChange)时回调,该回调中可以做一些资源回收等操作
重点
- 当Activity A启动一个透明的Activity或者一个Dialog主题的Activity时,A的onStop不会调用,因为其还可见
- 当Activity A开启一个Dialog,不会调用A的任何生命周期方法
- 当Activity A开启Activity B会调用A.onPause - B.onCreate - B.onStart - B.Resume - A.onStop(视情况,当A完全不可见时会调用)
- 当Activity A启动Activity B然后点击back键会回调B.onPause - (如果A处于stop状态还有A.onRestart - A.start)A.onResume - B.onStop
- 当Activity A失去焦点后,当内存不足时系统可能会将A杀死,当点击回退后会调用A的onCreate - onStart - onResume进行重建
二、Fragment的生命周期与Activity的关系
首先来看看Fragment的生命周期
onAttach(Activity)当Fragment与Activity建立联系时调用onCreate(Bundle)当初始化创建Fragment的时候回调onCreateView(LayoutInflate, ViewGroup, Bundle)创建和返回Fragment显示的根ViewonActivityCreated(Bundle)当与Fragment相联系的Activity完成了onCreate回调onStart()当Fragment可见时回调onResume()当Fragment获取焦点时回调onPause()当Fragment失去焦点时回调onStop()当Fragment不再可见时回调onDestoryView()用于清除与Fragment相关联View的资源onDestory()当Fragment将要被销毁时调用onDetach()当调用该方法后Fragment就与Activity失去联系了
将设有Activity A在onCreate通过Replace方显示了Fragment F,生命周期调用顺序为A.onCreate - A.onStart - F.onAttach - F.onCreate - F.onCreateView - F.onViewCreate - F.onActivityCreate - F.onStart - A.onResume - F.onResume
三、Activity与menu创建先后顺序
在Activity的onResume调用完后会回调onCreateOptionMenu来创建Menu
四、使用onSavedInstanceState()和onRestoreInstanceState()保存状态
-
onSavedInstanceState当Activity被意外的杀死或者是当配置方式改变后会回调onSavedInstanceState(在API28及以上其调用时机在onStop之后,在API28之前调用时机onStop之前与onPause无时序关系) -
onRestoreInstanceState再次启动后我们可以在onRestoreInstanceState中恢复onSavedInstanceState保存的数据