首页 > 其他分享 >一文彻底搞懂 Activity 的生命周期

一文彻底搞懂 Activity 的生命周期

时间:2023-06-22 14:04:51浏览次数:28  
标签:onResume 生命周期 onStart onStop Activity 搞懂 onSaveInstanceState My


作为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的生命周期相关的知识点已经讲得差不多了,再多的也什么可将的了,只要你懂得了以上的知识点,应付日常的开发应该已经是够了。

标签:onResume,生命周期,onStart,onStop,Activity,搞懂,onSaveInstanceState,My
From: https://blog.51cto.com/u_16163453/6534778

相关文章

  • ios生命周期整理
    iosAppstates 应用的五种状态State 描述 Notrunning        应用没有被启动;或者应用正在运行但是途中被系统终止了。 Inactive     应用在前台运行,但是还不能接收事件(当时或许正在执行其他代码);一个应用通常只是很短时间停留在这个状态,很快它将切换到......
  • Android | Activity 启动流程分析
    前言Activity类是android应用的关键组件,在日常开发中,绝对少不了组件。既然用了这么久,你知道他的启动流程......
  • 到底什么是Java AIO?为什么Netty会移除AOI?一文搞懂AIO的本质!
    本文由得物技术团队Uni分享,即时通讯网收录时有内容修订和大量排版优化。1、引言关于Java网络编程中的同步IO和异步IO的区别及原理的文章非常的多,具体来说主要还是在讨论JavaBIO和JavaNIO这两者,而关于JavaAIO的文章就少之又少了(即使用也只是介绍了一下概念和代码示例)。在深......
  • 如何快速发现 ASP.NET Core 应用程序中的服务生命周期问题?【转】
    在ASP.NETCore中,内置了非常强大的依赖注入容器功能。但是,如果不正确使用,也可能会引起一些问题。问题下面我们通过一段示例代码来说明这个问题。public interface IServiceA{    string Get();}public interface IServiceB{    string Get();}public class S......
  • 一个例子帮你搞懂C#语言高级特性系列(02) --- 委托、事件和Lambda表达式
    直接看例子吧:usingSystem;usingSystem.Windows.Forms;usingSystem.Threading;namespaceCom.LoonStudio.Example{publicclassCar{//定义一个汽车事件的委托publicdelegatevoidCarEventHandler(stringmsg);//定义加速事件......
  • 带你彻底掌握Bean的生命周期
    摘要:我们将深入研究SpringFramework的核心部分——SpringBean的生命周期。本文分享自华为云社区《Spring高手之路5——彻底掌握Bean的生命周期》,作者:砖业洋__。1.理解Bean的生命周期1.1生命周期的各个阶段在SpringIOC容器中,Bean的生命周期大致如下:实例化:当启动Spring应用时,I......
  • 如何更改已注册服务的生命周期?【转】
    前言我们知道在ASP.NETCore中,内置了一个依赖注入容器,可用于注册和解析服务。在注册服务时,我们需要指定服务的生命周期:Transient:每次请求服务时都会创建一个新的实例。Scoped:每次请求服务时都会创建一个新的实例,但在同一个请求内,每次请求服务时都会使用同一个实例。S......
  • kubernetes 生命周期问题分析
    1.Failed --pod里至少一个容器以非0code退出,说明应用有问题,需要debug应用容器2.pending--说明API对象已经被创建和保存在etcd数据库里,但是创建过程出了问题,可能是imagepull出问题,也可能是调度出了问题3.Unknow--说明pod的状态不能持续地被Kubelet发送给kubeapi,这很可能是......
  • java~搞懂Comparable接口的compareTo方法
    Comparable接口的compareTo方法的升序或降序取决于实现该接口的类的具体实现。按照惯例,compareTo方法应该返回负数、零或正数来指示当前对象是小于、等于还是大于传入的对象。具体来说:如果this对象小于传入的对象,则compareTo应该返回负数。如果this对象等于传入的对......
  • 你曾遇到的某大厂奇葩问题:Android组件化开发,组件间的Activity页面跳转
    组件化开发有什么好处?1、当项目越来越大时,app的业务越来越复杂,会出现业务功能复杂混乱,各功能块、页面相互依赖,相互调用太多导致耦合度高,而采用组件化开发,我们就可以将功能模块合理的划分,降低功能耦合度。2、不采用组件化开发时,编译速度缓慢,修改一个页面布局编译一下还得等几分钟。......