简述android activity的生命周期

本文详细阐述了Android中Activity的生命周期,包括运行、暂停、停止和销毁四种状态及其转换。重点介绍了与生命周期相关的回调方法,如onCreate(), onStart(), onResume(), onPause(), onStop(), onDestroy()以及onSaveInstanceState()。此外,还探讨了activity被系统回收的情况,强调了在onSaveInstanceState()中保存数据的重要性。最后,提到了屏幕旋转时activity生命周期的变化以及如何通过配置文件控制这一行为。" 132126771,7337247,物联网智能商城:企业级解决方案与数据分析,"['物联网', '大数据', '机器学习', '云计算', '电子商务']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简述android activity的生命周期

前言

android的activity的生命周期总体来说非常简单,自然也是必要掌握的基础知识点。

首先,我们知道android中的activity是可以层叠的,启动新activity会覆盖在原activity上,点击back则销毁当前activity,下面的activity重新显现,这样的结构会容易让人联想到栈。是的,android通过一个叫做back stack的栈来管理activity,每当启动新activity,它都会入栈从而处于栈顶,而当按下back或者我们直接调用finish()方法销毁活动时,它就会出栈,系统总是会显示栈顶的activity。

activity的状态

讨论完activity之间的切换后,我们来介绍一下activity的四种可能的状态

  • 运行状态
    当activity处于栈顶时,便是运行状态,系统一般是不会回收该activity。
  • 暂停状态
    当activity不再处于栈顶,但是仍然可见时,activity进入了暂停状态。此时有可能是栈顶的activity并没有占满整个屏幕所致。系统也并不倾向于回收这种状态的activity。
  • 停止状态
    当activity不再处于栈顶,且不可见时,此时即是停止状态。系统会试着维护activity的状态和成员变量,但这并不完全可靠,当系统需要释放内存时,处于停止状态的activity就有可能被回收。后面会提到如何解决这个问题。
  • 销毁状态
    当acativity出栈后就变成了销毁状态,系统会毫不犹豫地回收该状态的activity。

与activity生命期有关的方法

Activity类定义了7个回调方法来覆盖整个生命周期。

  • onCreate()
    这个方法我们已经非常熟悉了,它会在activity第一次被创建时调用,完成activity的初始化操作。
  • onStart()
    当activity由不可见变为可见时调用。
  • onResume()
    activity准备好与用户进行交互时调用,即它位于栈顶,处于运行状态。
  • onPause()
    系统准备启动或者恢复另一个活动,使之来到前台,却又不使当前活动完全不可见时调用,即当前活动进入暂停状态。它通常会进行一些资源释放和数据保存操作。
  • onStop()
    当activity完全不可见时调用,即进入暂停状态,和onPause()相似。
  • onDestroy()
    在activity被销毁前调用,之后activity的状态即是销毁状态。
  • onRestart()
    在activity由停止状态变为运行状态前调用,即activity被重新启动。

activity生命期的分类

根据几个方法的对应关系,可以将activity分为三种生命期。

  • 完整生命期
    activity在onCreate()和onDestroy()之间的经历,即是完整生命期,在前者中进行初始化操作,在后者中进行释放内存的操作。
  • 可见生命期
    activity在onStart()和onStop()之间的经历,即是可见生命期。activity在这个生命期内对用户总是可见的,但不总是能与用户交互的。合理利用这两个方法管理资源,可以保证activity在停止状态不占用过多内存。
  • 前台生命期
    activity在onResume()和onPause()之间的经历,即是前台生命期,此时activity总是处于运行状态,可以和用户进行交互,这是我们平时看到和接触到最多的activity状态。

附1 如果activity惨遭回收

前面我们提到,处于停止状态的activity是可能被回收的,此时如果我们又要回到这个activity,就不再执行onRestart()方法了,而是执行onCreate()方法,即activity会被重新创建一次。
当然,这里有一个问题,如果被回收的activity存在临时数据和状态,那么这些内容就丢失了,这是我们不愿意看到的,所以,Activity类中还提供了一个onSaveInstanceState()回调方法,这个方法保证activity被回收前一定会被调用,所以我们可以在该方法中进行数据保存。
onSaveInstanceState()会携带一个Bundle类型的参数,Bundle有多重方法保存数据,例如使用putString()方法保存字符串,putInt()保存整数,等等。这些方法采用键值对的机制进行传参,即第一个参数是键值,用于后面取值,第二个参数是保存的内容。
举个例子:

@Override
protected void onSaveInstanceState(Bundle outState){
    super.onSaveInstanceState(outState);
    String tempData = "temp data";
    outState.putString("data_key",tempData);
}

然后便是恢复数据的操作,我们知道,在onCreate()中其实也有个Bundle类型的参数,一般情况下它是一个空值,但是如果我们之前有过使用onSaveInstanceState()进行数据保存的话,这个参数就会带有所有被保存的数据,于是我们只要通过这个参数进行取值就行。

@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if(savedInstanceState != null){
        String tempData = savedInstanceState.getString("data_key");
    }
}

附2 关于竖屏、横屏切换时activity的生命期

现在的系统,不管是竖屏切横屏,还是横屏切竖屏,一般都只会调用一次完整生命期,即activity被重新创建一次,但是如果是老版本的系统,有可能会出现横屏切竖屏时调用两次完整生命期的情况。
如果想手动调整切屏时activity的生命期,则可以修改其xml文件中的android:configChanges属性,当设置为android:configChanges="orientation"时,会严格按照只调用一次生命期的,当设置为android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。(执行这个方法,必须设置sdk version 大于等于13.0)

主要参考资料:《第一行代码-android》第2版,郭霖 著

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值