为了更好的学习和掌握Android开发技能,将对整个Android系统进行分析记录.萌新一枚,若有任何错误的地方望各位大佬指点纠正.
本篇主要分析Activity的生命周期,其生命周期分为两部分内容:
1.典型情况(Activity不受外部异常影响 正常完成生命周期)
2.异常情况(Activity被系统回收或设备Configuration发生改变)
1.典型情况下的生命周期分析
Android内部对Activity生命周期的各个阶段进行响应,不同阶段调用不同的方法,先来一张看了又看的Activity生命周期图.
官方生命周期图在逛技术贴的时候,还发现了一张更好解释生命周期的图.
生命周期金字塔图详细解读每个方法的调用场景
-
onCreate:
该方法在Activity创建时被调用,可以进行一些数据的初始化及加载界面布局资源等.该方法在一个Activity的生命周期内只会执行一次. -
onRestart:
该方法只有在目标Activity执行完onStop方法后回到前台时调用即跳出不可见不可交互状态转为可见进一步变为可见可交互状态.onRestart方法执行完后紧跟着onStart方法. -
onStart:
该方法表示Activity正在被启动,处于可见状态,但不能交互,还未出现在前台. -
onResume:
该方法表示Activity已处于可见可交互状态,此状态下用户可进行交互动作.
需要注意的是onStart和onResume两个方法都表示Activity处于可见状态,但只有调用onResume方法后activity才显示到前台与用户交互. -
onPause:
该方法表示Activity正在停止,处于可见不可交互状态.正常情况下在调用onPause后紧跟着执行onStop方法.
如果调用onPause方法后Activity快速回到前台就会直接执行onResume方法.
如果系统内存紧张执行GC时也有可能会回收处于onPause状态下的 Activity.
需要注意的是onPause方法中仅可以做一些不耗时的回收或存储数据工作,因为新Activity显示需要前一个Activity执行完onPause方法后才会执行onResume方法. -
onStop:
该方法表示Activity正在停止,处于不可见不可交互状态.可以在此方法中执行一些稍微重量级的回收工作,但仍不能太耗时. -
onDestroy:
该方法是Activity生命周期的最后一个方法,可以在此方法中执行重量级回收工作等.执行完该方法标志着此Activity已经销毁了.该方法在一个Activity的生命周期内只会执行一次.
- 启动一个Activity时执行 onCreate -> onStart -> onResume
- 当用户从本Activity打开新的Activity或切换到桌面或锁定屏幕时,执行 onPause -> onStop.注意当打开的Activity是个DialogActivity或透明背景时,原Activity仅执行onPause,处于可见不可交互状态.具体分析
- 当用户再次回到原Activity时,执行 onRestart -> onStart -> onResume
- 当用户点击back按键时,执行 onPause -> onStop ->onDestroy
- 从整个生命周期看onCreate和onDestroy对应,表示Activity的创建和销毁,在生命周期里仅能执行一次.onStart和onStop对应,表示Activity是否可见.onResume和onPause对应,表示Activity是否在前台,是否可交互.随着用户操作下面两对方法都会多次调用.
2.异常情况下的生命周期分析
本小节主要分析异常情况下Activity的生命周期变化,一般造成异常情况主要是系统配置改变或内存不足造成Activity被杀死.
2.1系统配置发生改变引起生命周期的异常变化
举个例子:开启手机的自动旋转后,当Activity从竖直状态转变为横屏时,系统会自动销毁原先的Activity并重建.如果我们不做特殊处理,那么每当系统配置改变时,我们的Activity都会销毁重建.如下图所示:
旋转手机Activity生命周期变化-
当我们将手机从竖屏转变为横屏时,可以看到原Activity执行 onPause -> onSaveInstanceState -> onStop -> onDestroy 走完原Activity的生命周期.
-
当原Activity销毁后又会迅速的开启新的Activity执行 onCreate -> onStart -> onRestoreInstanceState -> onResume 最终新的Activity显示在用户界面上.
-
onSaveInstanceState 和 onRestoreInstanceState 两个方法仅在生命周期异常情况下执行,前者主要是对异常销毁的Activity进行一些数据保存,后者主要是对存储的数据进行恢复,数据存取都是通过Bundle,因此我们可以在Bundle中附加个人数据进行读写.经过测试onSaveInstanceState在onStop前调用,onRestoreInstanceState在onStart方法后调用.这两个方法执行的过程中,系统会自动对视图进行信息数据的存取,例如:ListView的滚动位置等等.
2.2内存不足引起生命周期的异常变化
这种情况下数据的存取和上一小节完全一致.内存不足引起Activity被回收,主要还是其优先级过低造成的.一般情况下对Activity是否回收分为一下三种优先级,从高到低排序:
- 前台Activity(可见可交互状态),优先级最高.
- 可见不可交互的Activity,例如上面弹出一个对话框等,使得Activity无法和用户交互.
- 后台Activity(不可见不可交互状态),已经暂停的Activity,优先级最低
当系统内存不足时,系统会按优先级去杀死进程,并通过 onSaveInstanceState 和 onRestoreInstanceState 两个方法来存储和恢复数据.如果一个进程中没有四大组件在执行,那么该进程将很快被系统杀死,因此,一些后台工作不适合脱离四大组件而独立运行在后台中,这样进程若有被杀死.比较好的方法是将后台工作放到Service中从而保证进程有一定优先级,这样就不会被轻易的杀死.
通过上述分析,我们知道当系统配置改变时会时Activity销毁重建.通过在AndroidMainManifest.xml中为Activity添加configChanges属性去避免Activity的销毁重建.configChanges的属性有很多例如:orientation(屏幕方向变化)、KeyboardHidden(虚拟键盘可访问性变化)等,通过设置这些属性后当运行过程中发生上述情况Activity不会销毁重建也不会调用 onSaveInstanceState 和 onRestoreInstanceState 两个方法,取而代之的是执行onConfigChanged方法,我们可以在其中做些特殊处理.
configChanges添加orientation后效果总结
本篇分析Activity的正常生命周期以及异常状态下的生命周期变化,相信看完此篇后对其生命周期有了大致的了解.推荐大家去看下任玉刚大神的Android开发艺术探索,对于萌新来说会有很大的帮助.
网友评论