Activity的生命周期 Activity的生命周期

Activity的生命周期
Activity的生命周期

首先给出Google官方API中的图片:

Activity的生命周期
Activity的生命周期

注意以下回调方法都是在UI线程中执行的,所以通常不能直接执行耗时的操作。

onCreate

  • 创建Activity首先要执行onCreate。
  • onCreate中通常执行一些初始化的工作,比如:创建各View组件、绑定数据等。
  • onCreate后一定跟着执行onStart方法。

onStart

  • Activity即将转入前台变成可见的状态( 此时还不可见)。
  • onStart后可能执行onResume或者onStop方法,若Activity还没来得及转入前台变成可见就被finish了,则后跟执行onStop方法,若Activity成功转入前台变成可见,则后跟执行onResume方法。

onResume

  • Activity已经转入前台变成可见的状态,获得用户焦点。
  • onResume后一定跟着执行onPause方法。
  • onResume中通常可以执行一些恢复工作,恢复Activity在之前保存的状态。

onPause

  • 其他Activity即将转入前台,此Activity即将失去焦点。
  • 如果即将转入前台的新Activity会完全遮住此Activity,则onPause后将执行onStop;如果即将转入前台的新Activity不会完全遮住此Activity(非全屏或者透明),则onPause后将执行onResume。
  • onPause中通常可以保存一些持久化的信息,以便在onResume时可以恢复。

onStop

  • Activity变成完全不可见的状态。
  • onStop中通常执行一些清理工作,比如:注销监听器、关闭线程。
  • onStop执行之后Activity实例对象仍然存活在内存中,若后续用户又希望与此Activity交互,则系统会调用onRestart重新启动此Activity;若系统需要回收内存其占用的内存则会调用onDestory清理。

onDestory

  • Activity的资源即将被系统回收,这是此Activity在彻底消亡之前的最后一次回调。
  • 调用onDestory可能是系统回收内存调用,也可能是主动调用finish方法导致的。

onStart到onStop这几个方法随着频繁切换Activity会经常被调用,而对onResume和onPause的调用最频繁,只能执行一些轻量级的操作。onPause、onStop和onDestroy方法中的任意一个执行之后,系统都有可能为了获取更多内存服务高优先级进程而kill掉Activity所属的进程,因此onPause方法是最后能够确保执行的机会,通常在onPause中对一些持久化的信息进行保存。


Activity还提供了onSaveInstanceState方法,这个方法在onStop之前由系统调用,在这个方法中通常将一些与UI相关的信息保存到Bundle参数中。当以后再次返回该Activity时,系统会在调用onCreate和onRestoreInstanceState时传入之前保存的Bundle对象。需要注意的是onSaveInstanceState方法在用户使用Back键退出此Activity时并不会被调用,通常会在旋转屏幕这种场景下被调用。
Activity中的大多数View都有默认的onSaveInstanceState实现,用来保存特定View对于相关UI信息的保存,例如:EditText会保存编辑框中的内容、CheckBox会保存选中状态。


Activity切换过程中的生命周期转换流程
(ActivityA切换到ActivityB)

ActivityA.onPause()
ActivityB.onCreate()
ActivityB.onStart()
ActivityB.onResume()
ActivityA.onStop()

  • 要注意的就是ActivityA的onStop方法在ActivityB执行onResume之后才被执行,对于ActivityA和ActivityB都使用到的公共资源的访问顺序就需要考虑上述流程的执行顺序。