生命周期的分类

  • 典型情况是指在用户正常操作界面导致Activity生命周期发生改变的情况。
  • 异常情况是指由于内存不足导致低优先级的Activity被系统回收,或者由于当前设备的Configuration发生改变(如旋转屏幕)而导致Activity销毁重建的情况。

典型情况下的生命周期

在Activity从创建到消亡的过程中,通常需要先后经历以下7个生命周期函数。

  • onCreate:表示Activity正在被创建,在这个方法中,通常会做一些初始化的工作,比如调用setContentView去加载界面布局资源,绑定事件,初始化Activity所需的数据等。
  • onRestart:表示Activity正在重新启动,当Activity从不可见状态重新变为可见状态时被调用。比如用户切换到其他界面,使当前界面不可见,接着又回到这个Activity的时候。
  • onStart:表示Activity正在被启动,此时Activity已经可见,但是还没有出现在前台,还处于后台,无法同用户交互。
  • onResume:表示Activity已经可见并且出现在前台,此时可以和用户进行交互
  • onPause:表示Activity正在停止,此时Activity从前台转为后台,失去交互能力,但有可能还能被看见(比如当前Activity弹出一个Dialog)。此时可以做一些不太耗时的操作,释放一些消耗CPU的资源,如存储关键数据、停止动画。onPause必须先执行完,新Activity的onResume才会执行。
  • onStop:表示Activity即将停止,此时Activity变为不可见状态。此时可以做一些稍微重量级的回收工作,但不能太耗时。
  • onDestroy:表示Activity即将被销毁,在这里可以做最后的资源回收和释放。

Activity的生命周期 - 图1

Activity的三种生存期

可以通过以上方法将Activity分为三种生存期。

  • 完整生存期:活动在onCreate和onDestroy之间称为完整生存期。通常情况下在onCreate进行初始化,在onDestroy中完成资源释放。
  • 可见生存期:活动在onStart和onStop之间称为可见生存期。通常情况下在onStart方法中对资源进行加载,在onStop中对资源进行释放,保证在停止状态下不会占用过多的CPU和内存资源。
  • 前台生存期:活动在onResume和onPause之间称为前台生存期。此时Activity处于运行状态,可以和用户进行交互。

生命周期的几种情况

  1. 对一个Activity,第一次启动回调过程为:onCreate -> onStart -> onResume。
  2. 当用户打开新的Activity或者按HOME键回到桌面或锁屏时,当前Activity的回调过程为:onPause -> onStop。
  3. 当用户再次回到Activity时,回调过程为:onRestart -> onStart -> onResume。
  4. 当用户按BACK键回退时,回调过程为:onPause -> onStop -> onDestroy。
  5. 在整个生命周期内,onCreate 和onDestroy只有一次调用,而其他几个生命周期函数随着用户的操作可能多次调用。
  6. 假设要从当前ActivityA跳转到另一个ActivityB,ActivityA的onPause 方法肯定在ActivityB的onResume方法之前执行。

异常情况下的生命周期

情况一:Configuration发生改变

为了适配不同尺寸的屏幕,Android程序应该提供不同尺寸的资源,比如在平板和手机中横屏和竖屏的情况下,加载的资源文件就不一样,当系统的Configuration发生改变,在默认情况下,Activity会被销毁并重新创建。此时的生命周期如下图所示。
Activity的生命周期 - 图2

在Activity销毁时,除了调用onPause -> Onstop -> OnDestroy外,还会调用Onstop 之前调用onSaveInstanceState来保存当前Activity的状态(正常的生命周期不会调用这个方法),并将保存的Bundle对象传入到onRestoreInstanceState(在onStart之后调用)中进行恢复。在Activity异常情况下需要重新创建时,系统会默认保存当前的视图结构(比如文本框中用户输入的数据、ListView滚动位置等),每个View中都有onSaveInstanceState和onRestoreInstanceState方法,每个View会保存和恢复哪些数据可以在这两个方法中看到。

需要注意的是,onSaveInstanceState和onRestoreInstanceState只会在Activity异常销毁并且有机会再次显示的时候才调用,如果没有机会再次显示,则不会调用。

Oncreate和onSaveInstanceState参数的区别

  • onSaveInstanceState一旦被调用,参数一定是有值的。
  • onCreate被调用,参数可能为null。

不想系统配置改变时Activity重建的措施

  1. android:configChanges="orientation"

情况二:内存资源不足导致低优先级Activity被杀死

当系统内存不足时,系统会杀死低优先级的Activity所在的进程,并通过onSaveInstanceState和onRestoreInstanceState保存和恢复数据,如果一个进程中没有四大组件在运行,这个进程将很快被杀死。所以,后台工作不适合脱离四大组件独自运行在后台中,通常需要将后台工作放在Service中保证进程有一定的优先级。

Activity的优先级

Activity的优先级从高到低为:

  1. 前台Activity—正在和用户交互的Activity,优先级最高。
  2. 可见但非前台Activity—比如弹出一个对话框的Activity。
  3. 后台Activity—已经被暂停的Activity,优先级最低。