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

110 篇文章 12 订阅
2 篇文章 0 订阅

作为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的生命周期的图出来供大家继续深入理解:

文末

我总结了一些Android核心知识点,以及一些最新的大厂面试题、知识脑图和视频资料解析。

需要的小伙伴直接点击文末小卡片免费领取哦,以后的路也希望我们能一起走下去。(谢谢大家一直以来的支持,需要的自己领取)

Android学习PDF+架构视频+面试文档+源码笔记

部分资料一览:

  • 330页PDF Android学习核心笔记(内含8大板块)

  • Android学习的系统对应视频

  • Android进阶的系统对应学习资料

  • Android BAT大厂面试题(有解析)

领取地址:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值