作为Android四大组件之一的Activity,是直接与用户进行交互的界面,承担着提升用户体验的很大一部分责任,深入剖析Activity的生命周期,才能掌握应用在各种情况下的状态改变。本文分两种情况下对Activity的生命周期进行分析。
===========================================================
一:正常情况下Activity生命周期
Activity有如下生命周期:
1.onCreate:生命周期的第一个方法,通常在此进行布局初始化和资源id的绑定等(setContenView,findViewByID等)
2.onStart:表示Activity正在启动,已经可见,但是还没显示,无法与用户交互。
3.onResum:表示Activity已经可见并且可交互。
4.onPause:表示Activity正在停止,可在此进行不耗时的轻量级的数据存储和资源释放工作。
5:onStop:表示Activity即将停止,可在此进行不耗时的稍微重量级的回收工作。
6:onRestart:表示Activity正在重新启动,一般情况下当Activity从不可见变回可见时会调用此方法(比如说用户按下home键回到桌面而后在此进http://wowubuntu.com/markdown/入应用界面)
7:onDestory:表示Activity正在被销毁,这是最后一个生命周期,在此进行最后的资源释放回收工作。
Activity生命周期流程图(developer.android.com)
从流程图可以看出Activity的生命周期有七个,其回调流程可分为几个:
1:首次启动:onCreate->onStart->onResume
2:启动过后再次返回:onReatart->onStart->onResume
3:前台Activity变得不可见:onPause->onStop(特殊情况:新启动的activity使用了透明主题,当前Activity不会回调onStop)
4:用户按home键返回桌面:onPause->onStop->onDestory
接下来我们来讨论下onStart和onResume,onPause和onStop的不同点。onStart和onStop是从Activity的可见性的角度来回调的,而onResume和onPause是从Activity是否位于前台的角度 来回调的。 那么当一个ActivityA启动了另一个ActivityB,A回调方法中的onPause和B中的onResume哪个会先调用呢, 经过试验可以得知,是A中的onPause先调用,然后B才会创建启动,具体原因可以查看源码分析。
二:异常情况下activity生命周期
异常情况包括内存不足、屏幕旋转等非正常情况下导致的Activity被杀死。
1:屏幕旋转导致的Activity呗杀死并重新创建
一般情况下,旋转屏幕会导致系统资源的重新加载,如果Activity不做特殊处理,会引发Activity的销毁和重建,此时会回调onSaveInstanceState方法,然activity会onDestory,然后重新创建后会调用onRestoreInstanceState;我们可以在onSaveInstanceState方法中保存我们的界面上的一些需要在重新创后恢复的数据,值得一提的是,此方法的调用时间是在onStop之前,但是不保证和onPause调用是哪个先哪个后,而且onSaveInstanceState方法一定是在activity异常终止的时候才会回调,正常的退出是不会回调的。然后当异常杀死的activity重新创建后会回调OnRestoreInstanceState方法,并把onSaveInstanceState保存的Bundle对象传递进来,我们可以从中取出之前保存的数据进行恢复,而且onRestoreInstanceState是在onStart调用之后的。
2:内存不足导致低优先级的Activity被杀死
所谓的Activity优先级,可以分为三种: (1):最高优先级,即前台Activity,也就是正在与用户交互的Activity,拥有最高优先级。 (2):次级,可见但是非前台的Activity,被某些弹出遮盖一部分的Activity,此时虽然可见但无法与用户交互。 (3):最低优先级,此时Activity处于后台,已经调用了onStop回调,最容易被杀死。 当系统内存不足时会按照以上优先级从低到高杀死Activity以腾出内存使系统正常工作,被杀死的Activity会像"情况1"中提到的进行存储和恢复数据。