简述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版,郭霖 著
- 简述android的activity生命周期。
- 简述android activity的生命周期
- 简述Activity的生命周期
- 简述Activity的生命周期
- Android activity的生命周期
- Android:Activity的生命周期
- Android Activity的生命周期
- Android Activity的生命周期
- Android Activity的生命周期
- Android activity的生命周期
- Android activity的生命周期
- Android activity的生命周期
- Android activity的生命周期
- Android Activity的生命周期
- Android activity的生命周期
- Android activity的生命周期
- android activity的生命周期
- Android activity的生命周期
- C++动态规划算法之最长上升子序列
- 1.2 Unity3D 的注册
- Java设计模式笔记之模板方法模式
- 我的学习之路_第七章_list集合,set集合
- STL----lower_bound和upper_bound算法
- 简述android activity的生命周期
- 如何取消程序的默认打开方式 windows亲测简单有效!
- python笔记----客户端与服务端
- NOIP 2005过河
- 向 Linus Torvalds 学习让编出的代码具有 “good taste
- edge函数使用
- windows程序设计一 最简单的windows程序
- lseek随机读取函数的使用
- 计蒜客-2017 计蒜之道 复赛-B-Windows 画图