Android Activity生命周期的一点感悟

3,268 阅读6分钟

活动生命周期结论

  • 启动 Activiy:onCreate => onStart() => onResume(), Activity 进入运行状态.
  • Activity 退居后台 ( Home 或启动新 Activity ): onPause() => onStop().
  • Activity 返回前台: onRestart() => onStart() => onResume().
  • Activity 后台期间内存不足情况下当再次启动会重新执行启动流程。
  • 锁屏: onPause() => onStop().
  • 解锁: onStart() => onResume().

初识Activity

在日常应用中Activity是与用户交互的接口,它提供了一个用户完成相关操作的窗口。当我们在开发中创建Activity后,通过调用setContentView(View)方法来给该Activity指定一个布局界面,而这个界面就是提供给用户交互的接口。Android系统中是通过Activity栈的方式来管理Activity的,而Activity自身则是通过生命周期的方法来管理的自己的创建与销毁,既然如此,现在我们就来看看Activity生命周期是如何运作的。

Activity的形态

Active/Running

Activity处于活动状态,此时Activity处于栈顶,是可见状态,可与用户进行交互。

Paused

当Activity失去焦点时,或被一个新的非全屏的Activity,或被一个透明的Activity放置在栈顶时,Activity就转化为Paused状态。但我们需要明白,此时Activity只是失去了与用户交互的能力,其所有的状态信息及其成员变量都还存在,只有在系统内存紧张的情况下,才有可能被系统回收掉。

Stopped

当一个Activity被另一个Activity完全覆盖时,被覆盖的Activity就会进入Stopped状态,此时它不再可见,但是跟Paused状态一样保持着其所有状态信息及其成员变量。

Killed

当Activity被系统回收掉时,Activity就处于Killed状态。 Activity会在以上四种形态中相互切换,至于如何切换,这因用户的操作不同而异。了解了Activity的4种形态后,我们就来聊聊Activity的生命周期。

Activity生命周期

这里我们先来看一张经典的生命周期流程图:

典型的生命周期方法

onCreate

该方法是在Activity被创建时回调,它是生命周期第一个调用的方法,我们在创建Activity时一般都需要重写该方法,然后在该方法中做一些初始化的操作,如通过setContentView设置界面布局的资源,初始化所需要的组件信息等。

onStart

此方法被回调时表示Activity正在启动,此时Activity已处于可见状态,只是还没有在前台显示,因此无法与用户进行交互。可以简单理解为Activity已显示而我们无法看见摆了。

onResume

当此方法回调时,则说明Activity已在前台可见,可与用户交互了,onResume方法与onStart的相同点是两者都表示Activity可见,只不过onStart回调时Activity还是处于后台无法与用户交互,而onResume则已显示在前台,可与用户交互。当然从流程图,我们也可以看出当Activity停止后(onPause方法和onStop方法被调用),重新回到前台时也会调用onResume方法,因此我们也可以在onResume方法中初始化一些资源,比如重新初始化在onPause或者onStop方法中释放的资源。

onPause

此方法被回调时则表示Activity正在停止(Paused形态),一般情况下onStop方法会紧接着被回调。但通过流程图我们还可以看到一种情况是onPause方法执行后直接执行了onResume方法,这属于比较极端的现象了,这可能是用户操作使当前Activity退居后台后又迅速地再回到到当前的Activity,此时onResume方法就会被回调。当然,在onPause方法中我们可以做一些数据存储或者动画停止或者资源回收的操作,但是不能太耗时,因为这可能会影响到新的Activity的显示——onPause方法执行完成后,新Activity的onResume方法才会被执行

onStop

一般在onPause方法执行完成直接执行,表示Activity即将停止或者完全被覆盖(Stopped形态),此时Activity不可见,仅在后台运行。同样地,在onStop方法可以做一些资源释放的操作(不能太耗时)。

onRestart

表示Activity正在重新启动,当Activity由不可见变为可见状态时,该方法被回调。这种情况一般是用户打开了一个新的Activity时,当前的Activity就会被暂停(onPause和onStop被执行了),接着又回到当前Activity页面时,onRestart方法就会被回调。

onDestroy

此时Activity正在被销毁,也是生命周期最后一个执行的方法,一般我们可以在此方法中做一些回收工作和最终的资源释放。

Activity异常生命周期

异常的生命周期是指Activity被系统回收或者当前设备的Configuration发生变化(一般指横竖屏切换)从而导致Activity被销毁重建。异常的生命周期主要分以下两种情况:

  1. 相关的系统配置发生改变导致Activity被杀死并重新创建(一般指横竖屏切换)
  2. 内存不足导致低优先级的Activity被杀死

onSaveInstanceState和onRestoreInstanceState方法是干什么用的呢?

实际上这两个方法是系统自动调用的,当系统配置发生变化后,Activity会被销毁,也就是onPause,onStop,onDestroy会被依次调用,同时因为Activity是在异常情况下销毁的,android系统会自动调用onSaveInstanceState方法来保存当前Activity的状态信息,因此我们可以在onSaveInstanceState方法中存储一些数据以便Activity重建之后可以恢复这些数据,当然这个方法的调用时机必须在onStop方法之前,也就是Activity停止之前。至跟onPause方法的调用时机可以随意

当Activity被重新创建之后,系统还会去调用onRestoreInstanceState方法,并把Activity销毁时通过onSaveInstanceState方法保存的Bundle对象作为参数同时传递给onRestoreInstanceState和onCreate方法,因此我们可以通过onRestoreInstanceState和onCreate方法来判断Activity是否被重新创建,倘若被重建了,我们就可以对之前的数据进行恢复。onRestoreInstanceState方法的调用时机是在onStart之后的

这里有点需要特别注意,onSaveInstanceState和onRestoreInstanceState只有在Activity异常终止时才会被调用的,正常情况是不会调用这两个方法的。

如何选择onRestoreInstanceState和onCreate进行数据恢复?

其实两者都可以,两者的区别在于,onRestoreInstanceState方法一旦被系统回调,其参数Bundle一定不为空,无需额外的判断,而onCreate的Bundle却不一定有值,因为如果Activity是正常启动的话,Bundle参数是不会有值的,因此我们需要额外的判断条件,当然虽说两者都可以数据恢复,但更倾向于onRestoreInstanceState方法。