简述android activity的生命周期

来源:互联网 发布:js加载页面时自动执行 编辑:程序博客网 时间:2024/06/01 10:35

简述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()保存整数,等等。这些方法采用键值对的机制进行传参,即第一个参数是键值,用于后面取值,第二个参数是保存的内容。
举个例子:

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

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

@Overrideprotected 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版,郭霖 著

原创粉丝点击