Activity生命周期
说到activity的生命周期,其实这就跟android的结构一样,最开始学的时候书上就有写,但是直到真正入门了,写过一些程序了才搞得清之前看到的那些是啥意思。
首先是这张经久不衰的图(反正也是随手百度来的,水印就不去了)
可以看到,单独一个activity“从生到死”,所需的过程是onCreate,onStart,onResume,onPause,onStop,onDestroy七个过程
那么稍微说一下这七个过程,或者说七个方法:
onCreate():
顾名思义,activity创建时,所以这里需要执行的方法一般是加载布局,控件及一些变量参数的初始化
此时activity在后台,不可见
onStart():
activity开始时,这里其实也可以执行初始化工作,不过由于官方推荐及我们自身编程习惯,还是在onCreate里来进行这些操作
此时activity在后台,可见
onResume():
activity继续时,执行到这也标志着activity成功运行了,一般动画的初始化应该在这里进行
此时activity在前台,可见
onPause():
activity暂停时,一般是由于activity需要切换或者退出,将会执行该方法,该方法可以有0.5秒(超过0.5则会强制关闭activity)的时间来做一些较为轻量的工作,例如数据存储,去初始化等
此时activity在前台,可见
onStop():
activity停止时,一般执行资源回收的相关操作,此时activity还在内存中,如果需要的话还可以加载回去
此时activity在后台,不可见
onDestroy():
activity销毁时,还是执行资源回收的相关操作,此时activity已经完全被销毁了,如果需要的话只能重新打开了
此时activity在后台,不可见
onRestart():
activity重新开始时,当用户按Home键切换到桌面后又切回来或者从后一个Activity切回前一个Activity就会触发这个方法。这里一般不做什么操作。
此时activity在后台(据我推测),可见
这里说一下第八个过程
onSaveInstanceState():
保持实例状态,顾名思义就是保存当前的activity的一些所需要的参数,主要用于在Activity销毁时保存一些信息,以便下一次切换回来的时候或者打开的时候可以使用这些参数(之后会举例)
当Activity只执行onPause方法时(Activity a打开一个透明Activity b)这时候如果App设置的targetVersion大于android3.0则不会执行onSaveInstanceState方法。
当Activity执行onStop方法时,通过分析源码我们知道调用onSaveInstanceState的方法直接传值为true,所以都会执行onSaveInstanceState方法。
生命周期这么多,到底有啥意义,有什么用呢,下面我们举个例子,走一遍业务逻辑来看一下
public class MainActivity extends Activity { MapView mMapView = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获取地图控件引用 mMapView = (MapView) findViewById(R.id.map); //在activity执行onCreate时执行mMapView.onCreate(savedInstanceState),创建地图 mMapView.onCreate(savedInstanceState); } @Override protected void onDestroy() { super.onDestroy(); //在activity执行onDestroy时执行mMapView.onDestroy(),销毁地图 mMapView.onDestroy(); } @Override protected void onResume() { super.onResume(); //在activity执行onResume时执行mMapView.onResume (),重新绘制加载地图 mMapView.onResume(); } @Override protected void onPause() { super.onPause(); //在activity执行onPause时执行mMapView.onPause (),暂停地图的绘制 mMapView.onPause(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); //在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),保存地图当前的状态 mMapView.onSaveInstanceState(outState); } }
这是高德地图sdk的使用方法,官方文档标明了需要在这些生命周期内执行这些方法,那么我们走一遍流程
首先布局文件被加载——地图控件初始化——执行定位或其他操作(以定位举例),这时我们需要高德地图实现的功能都已经实现了,没问题,但是当用户需要切换activity或者结束activity的时候,我们首先执行到onPause,暂停地图的继续绘制(用户都不需要你继续定位了,就不用实时更新位置了),然后执行onSaveInstanceState,保存用户目前定位的点,以便下次回来的时候使用,如果关闭的话执行onDestroy,用户已经不需要这个activity了,地图控件也可以销毁了,释放资源,而如果是activity的切换,当切换回来时,会执行onCreate方法,用之前保存的参数来初始化地图(也就是打开之后直接显示上一次结束时的定位点),到这里看似好像还有一个onResume没说,但是其实也已经一直在这个循环内作用着,因为地图的绘制和一些动画,需要在这里进行初始化等操作。
最后说一下activity的切换流程
(A)onPause→(B)onCreate→(B)onStart→(B)onResume→(A)onStop
而不是
(A)onPause→(A)onStop→(B)onCreate→(B)onStart→(B)onResume
(1)一个Activity或多或少会占有系统资源,而在官方的建议中,onPause方法将会释放掉很多系统资源,为切换Activity提供流畅性的保障,而不需要再等多两个阶段,这样做切换更快。
(2)按照生命周期图的表示,如果用户在切换Activity的过程中再次切回原Activity,是在onPause方法后直接调用onResume方法的,这样比onPause→onStop→onRestart→onStart→onResume要快得多。
PS:参考博客:
Android源码解析(二十四)-->onSaveInstanceState执行时机