【Android】一文读懂 Activity 的生命周期

450 阅读3分钟

作为Android开发人,如果说连Activity生命周期都没搞懂,会走非常多的弯路,所以这篇文章我就对Activity生命周期的生命周期进行一个简单的总结。

单Activity生命周期的整体流程

首先,我们创建一个My_A_Activity,并且打印它的各个生命周期方法。

class My_A_Activity : AppCompatActivity() {
    private val TAG = "My_A_Activity"
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_my_act)
        Log.i(TAG,"onCreate")
    }
​
    override fun onRestart() {
        super.onRestart()
        Log.i(TAG, "onRestart")
    }
​
    override fun onStart() {
        super.onStart()
        Log.i(TAG, "onStart")
    }
    
    override fun onRestoreInstanceState(savedInstanceState: Bundle) {
        super.onRestoreInstanceState(savedInstanceState)
        Log.i(TAG, "onRestoreInstanceState")
    }
​
    override fun onResume() {
        super.onResume()
        Log.i(TAG, "onResume")
    }
​
    override fun onPause() {
        super.onPause()
        Log.i(TAG, "onPause")
    }
​
    override fun onStop() {
        super.onStop()
        Log.i(TAG, "onStop")
    }
​
    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        Log.i(TAG, "onSaveInstanceState")
    }
​
    override fun onDestroy() {
        super.onDestroy()
        Log.i(TAG, "onDestroy")
    }
}

现在,我们开始来走一遍单个Activity的生命周期吧!

启动My_A_Activity,日志打印如下:

My_A_Activity: onCreate
My_A_Activity: onStart
My_A_Activity: onResume

如果按下home键,日志打印如下:

My_A_Activity: onPause
My_A_Activity: onStop
My_A_Activity: onSaveInstanceState

如果此时再次点击图标进入,日志打印如下:

My_A_Activity: onRestart
My_A_Activity: onStart
My_A_Activity: onResume

此时,进行横竖屏切换,日志打印如下:

My_A_Activity: onPause
My_A_Activity: onStop
My_A_Activity: onSaveInstanceState
My_A_Activity: onDestroy
My_A_Activity: onCreate
My_A_Activity: onStart
My_A_Activity: onRestoreInstanceState
My_A_Activity: onResume

此时,退出app,日志打印如下:

My_A_Activity: onPause
My_A_Activity: onStop
My_A_Activity: onDestroy

以上流程还是很简单的,但是有一个生命周期比较特殊,那就是横竖屏切换的时候,在进行横竖屏切换时,Activity执行了:

onPause -> onStop -> onSaveInstanceState -> onDestroy

方法后又执行了:

onCreate -> onStart -> onRestoreInstanceState -> onResume,说明Activity被销毁并重建了。

这里需要注意一个点,如果Activity的configChanges属性配置了orientation时,横竖屏切换是不会走任何生命周期方法的,配置如下:

<activity
    android:name=".My_A_Activity"
    android:configChanges="orientation" />

那么还有一个问题,这个onSaveInstanceStateonRestoreInstanceState是什么方法呢?

其实,它们都不是Activity生命周期的方法,但是有必要知道它们的调用时机,所以这里对它们进行简单的介绍一下:

onSaveInstanceState

onSaveInstanceState(outState: Bundle):在某种时机下,Activity会调用onSaveInstanceState方法通过保存Bundle参数来保存当前的Activity的数据。

onSaveInstanceState(outState: Bundle)方法会在什么时机被调用呢?

有以下几种情况:

  • 按下HOME键切到后台时
  • 锁屏时(按下电源键或自动锁屏)
  • 从该Activity中启动一个新的Activity时
  • 横竖屏切换时 (前提是Activity的configChanges属性配置了orientation)

注意,onSaveInstanceState方法总是会在onStop后调用

onRestoreInstanceState

onRestoreInstanceState(savedInstanceState: Bundle):当Activity被重新创建(横竖屏切换,或者被系统强杀重启后的重新创建)之后就会调用onRestoreInstanceState,而它的Bundle参数,就是onSaveInstanceState方法保存的。onRestoreInstanceState这个方法会在onStart后调用

onRestoreInstanceState(savedInstanceState: Bundle)方法会在什么时机被调用呢?

有以下几种情况:

  • Activity在后台的情况下,被系统强杀了,再次打开Activity时
  • 横竖屏切换时 (前提是Activity的configChanges属性配置了orientation)

注意,onRestoreInstanceState这个方法会在onStart后调用

多Acitivity跳转的生命周期

我们在新建一个Activity,名字就叫My_B_Activity吧,跟My_A_Activity一样,我们直接打印它的各个生命周期方法,另外,在MainActivtiy中加上一个按钮,用于跳转到My_B_Activity。代码很简单,就不贴了。

当打开MainActivtiy,日志打印如下:

My_A_Activity: onCreate
My_A_Activity: onStart
My_A_Activity: onResume

点击按钮跳转到 My_B_Activity ,日志打印如下:

My_A_Activity: onPause
My_B_Activity: onCreate
My_B_Activity: onStart
My_B_Activity: onResume
My_A_Activity: onStop
My_A_Activity: onSaveInstanceState

可以看到,先执行了 My_A_Activity 的 onPause 方法,

然后继续执行了 My_B_Activity 的 onCreate -> onStart -> onResume

然后才执行了 My_A_Activity 的 onStop -> onSaveInstanceState

这个点要注意一下,比较关键!

好,我们继续走,销毁 My_B_Activity ,日志打印如下:

My_B_Activity: onPause
My_A_Activity: onRestart
My_A_Activity: onStart
My_A_Activity: onResume
My_B_Activity: onStop
My_B_Activity: onDestroy

可以看到,先执行了 My_B_Activity 的 onPause 方法,

然后继续执行了 My_A_Activity 的 onRestart -> onStart -> onResume

然后才执行了 My_B_Activity 的 onStop -> onDestroy

这里也是关键,需要注意!

好,我们继续走,销毁 My_A_Activity ,日志打印如下:

My_A_Activity: onPause
My_A_Activity: onStop
My_A_Activity: onDestroy

至此,本篇结束,其实Activity的生命周期相关的知识点已经讲得差不多了,再多的也什么可将的了,只要你懂得了以上的知识点,应付日常的开发应该已经是够了。最后,我再贴一张非常经典的Activity的生命周期的图出来供大家继续深入理解: