Activity的生命周期
Activity的生命周期分为两部分,一部分是典型情况下的生命周期,另一部分是异常情况下的生命周期。典型情况下的生命周期是指在有用户参与的情况下Activity所经过的生命周期的改变。异常情况下的生命周期是指Activity被系统回收或者由于当前设备的Configuration发生改变从而导致Activity被销毁重建。异常情况下的生命周期关注点和典型情况下略有不同。
典型情况下的生命周期
在正常情况下,Activity会经历如下生命周期
1.onCreate:表示Activity正在被创建,这是生命周期的第一个方法。我们可以做一些初始化的工作,比如调用setContentView去加载界面布局资源,初始化Activity所需数据等。
2.onStart:表示Activity正在被启动,即将开始,这时Activity已经可见了,但还是没有出现在前台,无法和用户交互,可以理解为Activity已经显示出来了,但是我们还看不到。
3.onRestart:表示Activity正在重新启动。一般情况下,当当前Activity从不可见重新变为可见状态时,onRestart就会被调用。这种情形一般是用户行为导致的。
4.onResume:表示Activity已经可见了,并且出现在前台并开始活动。要注意这个和onStart的对比,onStart和onResume都表示Activity已经可见,但是onStart的时候Activity还在后台,onResume的时候Activity才显示到前台。
5.onPause:表示Activity正在停止,正常情况下onStop紧接着会被调用。此时可以做一些数据存储,停止动画等工作,但是注意不能太耗时,因为这会影响到新的Activity的显示,onPause必须先执行完,新的Activity的onResume才会执行。注意:不能在onPause中做重量级的操作,因为必须pnPause执行完成以后新Activity才能Resume。
6.onStop:表示Activity即将停止,可以做一些稍微重量级的回收工作,同样不能太耗时。
7.onDestory:表示Activity即将被销毁,这是Activity生命周期中的最后一个回调,在这里,我们可以做一些回收工作和最终的资源释放。
从整个生命周期来说,onCreate和onDestory是配对的,分别标识着Activity的创建和销毁,并且只又可能一次调用。从Activity是否可见来说,onStart和onStop是配对的,随着用户的操作或者设备屏幕的点亮或者熄灭,这两个方法可能被多次调用,从Activity是否在前台来说,onResume和onPause是配对的,这两个方法也可能被多次调用。
异常情况下的生命周期
情况一:资源相关的系统配置发生改变导致Activity被杀死并重新创建
比如说当前Activity处于竖屏状态,如果突然旋转屏幕,由于系统配置发生改变,在默认情况下,Activity就会被销毁并重新创建,当然我们也可以阻止系统重新创建我们的Activity。
在默认情况下,如果我们的Activity不做特殊处理,那么当系统配置发生改变后,Activity就会被销毁并重新创建。
当系统配置发生改变后,Activity会被销毁,其onPause,onStop,onDestory均会被调用,同时由于Activity是在异常情况下终止的,系统会调用onSaveInstanceState来保存当前Activity的状态。这个方法的调用时机是在onStop之前,他和onPause没有既定的时序关系,它既可能在onPause之前调用,也可能在onPause之后调用。需要强调的是,这个方法只会出现在Activity被异常终止的情况下,正常情况下系统不会回调这个方法。当Activity被重新创建后,系统会调用onRestoreInstanceState,并且把Activity销毁时onSaveInstanceState方法所保存的Bundle对象作为参数同时传递给onRestoreInstanceState和onCreate方法。因此,我们可以通过onRestoreInstanceState和onCreate方法来判断Activity是否被重建了,那么我们就可以取出之前保存的数据并恢复,从时序上说,onRestoreInstanceState的调用时机在onStart之后。
情况二:资源内存不足导致低优先级的Activity被杀死
其数据存储和恢复过程的情况和情况一完全一致。
Activity按照优先级从高到低可以分为如下三种:
(1):前台Activity–正在和用户交互的Activity,优先级最高。
(2):可见但非前台Activity–比如Activity中弹出了一个对话框,导致Activity可见但是位于后台无法和用户直接交互。
(3):后台Activity–已经被暂停的Activity,比如执行了onStop,优先级最低。
当系统内存不足时,系统就会按照上述优先级去杀死目标Activity所在的进程,并在后续通过onSaveInstanceState和onRestoreInstanceState来存储和恢复数据。
系统配置有很多内容,如果当某项内容发生改变后,我们不想系统重新创建Activity,可以给Activity指定configChanges属性。当我们指定了configChanges属性后,Activity就不会出现重新创建,并且也不会调用onSaveInstanceState和onRestoreInstanceState来存储和恢复数据,取而代之的是系统调用了Activity的onConfigurationChanged方法,这个时候我们就可以做一些自己的特殊处理了。
Activity的启动模式