常见的各个生命周期介绍
onCreate()和onDestroy()
- onCreate:表示Activity正在创建,是Activity生命周期的第一个方法。在这个方法中我们可以做一些初始化工作。比如加载布局资源,初始化数据等。
- onDestroy:表示Activity即将被销毁,是Activity生命周期中的最后一个回调。我们一般在这里做一些回收工作和最终的资源释放
onStart()和onStop()
- onStart:表示Activity正在被启动,即将开始。这时Activity已经是可见的,但是还没完全出现在前台,是不可交互的。或者可以理解为Activity已经在内存中绘制出来了,但是在界面上我们还看不到。
- onStop:表示Activity即将停止,可以做一些轻量级的资源回收工作,注意耗时不能太长。
onResume()和onPause()
- onResume:Activity已经可以被用户观察到,也可以和用户进行交互。这个和onStart状态相比Activity不只是可见的,而且是可交互的。
- onPause:Activity正在停止,正常情款下下一个回调会是onStop。如果这个时候再回到当前Activity(比如singleTop模式时候自身启动自身),那么onResume会被调用。在这个方法中不宜进行耗时较长的操作,因为是此方法执行完后才回执行新页面的onResume所以耗时方法会让新页面显得卡顿
onNewIntent()
之前打开过得且还没有被销毁的Activity(既处于onPause
和onStop
状态),再次通过startActivity
方式启动时候,会先调用该方法,然后在调用onResume
。这种情况在Activity
的默认启动方式时候不会出现。而在另外三种启动模式时候会出现。
在此方法中需要更新intent
的值,否则intent
的取值会一直是最开始启动该Activity
的intent
值。
onSaveInstanceState()和onRestoreInstanceState()
- onSaveInstanceState:在Activity被异常结束时候,会先调用这个方法,然后在调用
onDestory()
方法,在这个方法中可以做一些数据保存的逻辑,以方便Activity恢复时候进行必要数据的恢复。在这个方法中系统已经做了一定的数据保存工作,例如文本框用户输入的数据、ListView滚动的位置等,具体的实现可以查看每个View源码中的同名方法。 - onRestoreInstanceState:在Activity从异常状态恢复时候,会在
onCreate()
之后调用,用来恢复onSaveInstanceState()
方法中保存的数据
正常情况生命周期变换
Activity的主要生命周期间的切换模式可以用如下图所示的流程图来概括:
然后我们在来分情况说明下Activity在各个状态下的生命周期调用逻辑:
- 正常启动一个Activity:
onCreate()
—>onStart()
—>onResume()
- 按返回键返回
finish
一个Activity:onPause()
—>onStop()
—>onDestroy()
- Activity显示是按home键:
onPause()
—>onStop()
- 从home回到刚才的Activity:
onRestart()
—>onStart()
—>onResume()
- 从A跳转到B(A、B均为默认模式Activity):A的
onPause()
—>B的onCreate()
—>B的onStart()
—>B的onResume()
—>A的onStop()
- 从B返回到A:B的
onPause()
—>A的onRestart()
—>A的onStart()
—>A的onResume()
—>B的onStop()
—>B的onDestory()
- 锁屏:
onPause()
—>onStop()
- 解锁:
onRestart()
—>onStart()
—>onResume()
异常情况下的生命周期变换
异常结束包括Activity的状态改变和内存不足Activity被回收的情况。两种情况下的生命周期都遵循下面的情况。
Activity被异常结束:
onPause()
/onSaveInstanceState()
—>onStop()
—>onDestroy
其中onPause
和onSaveInstanceState
没有固定的调用顺序Activity从异常状态恢复:
onCreate()
—>onStart()
—>onRestoreInstanceState()
—>onResume()
其他启动模式下的生命周期变换
- singleTop:如果A设置为
singleTop
,然后A启动自身时候生命周期是onPause()
—>onNewInntent()
—>onResume()
- singleTask:第一次启动时候,和正常Activity启动的方式一样,当再次启动该Activity时候,生命周期是:上个Activity的
onPause()
—>onRestart()
—>onStart()
—>onResume()
—>上个Activity的onStop()
—>上个Activity的onDestory()
。 - singleInstance:和singleTask的生命周期方式一致。
其他启动模式下的生命周期变换
- singleTop:如果A设置为
singleTop
,然后A启动自身时候生命周期是onPause()
—>onNewInntent()
—>onResume()
- singleTask:第一次启动时候,和正常Activity启动的方式一样,当再次启动该Activity时候,生命周期是:上个Activity的
onPause()
—>onRestart()
—>onStart()
—>onResume()
—>上个Activity的onStop()
—>上个Activity的onDestory()
。 - singleInstance:和singleTask的生命周期方式一致。
各种生命周期适合进行的操作总结
onCreate:正常情况下,该方法只会执行一次。鉴于这种情况,在Activity生命周期内,只需要初始化一次的变量可以在这个方法中初始化。比如findViewById。
-
onStart:只有当Activity有不可见变为可见才回执行一次。由部分可见到完全可见不执行,比如Activityactivity开启了另一个不完全覆盖的activity B,而再次关闭这个B的时候,将不会执行这个方法,但是会执行onResume。所以适合做如下操作:
- 播放一些在半覆盖情况下需要播放的动画
- 部分控件的初始化操作,例如GPS
-
onResume:在activity获得焦点的时候执行,之后用户就可以和activity进行交互了,所以适合如下操作:
- 与交互强相关的资源初始化,例如某些交互性较强的动画(比如下载进度)
- 对相机资源的使用。
-
onPause:当系统调用此方法是,意味着Activity处于部分可见状态,也意味着用户正在离开这个Activity,通常应该在onPause()回调方法里面做以下事情:
- 停止动画等浪费cpu资源的操作
- 释放系统资源,比如BroadcastRecceivers、相机等
- 注意此处不宜执行耗时过长的动作,例如保存较大的数据到本地、持久化一些统计信息等。这样将会拉长onPause的时间,从而影响下一个Activity的启动
-
onStop:在onStop中,可以执行一些较为耗时的操作,例如:
- 保存文本到本地
- 对一些调用频率较少的广播进行注销等操作。
- 对在onStart注册的资源进行释放等
-
onDestory:activity在销毁前会执行的生命周期方法,这个方法执行后,activity就可能会被回收了。在onDestory中可以释放一些变量,特别是在onCreate中初始化,行进在整个生命周期内的变量
例如:bitmap,bitmap的回收一直是android的一大问题,他的反复创建又比较耗费性能,如果在onStart中来创建,在onStop中来回收也不理想,如果这个页面需要经常切换,反而造成内存抖动,这种情况下,可以选择一直持有,在onDestroy中调用bitmap的recycle方法来回收。
总结:在onResume进行获取的资源适合在onPause中释放,这对方法中不适合耗时太长的方法。在onStart申请的资源对应的在onStop中释放,可以进行一些比较耗时的操作。onCreate和onDestroy中适合进行一些需要Activity长时间持有的资源的获取与回收,因为这俩方法在Activity的生命周期中只会调用一次。