您的位置:首页 > 移动开发 > Android开发

Android开发 全面解析Activity生命周期

2016-03-24 00:18 423 查看
关于Activity的生命周期,决定自己系统性地总结一次,本人水平有限,如果文中有错误之处,可指出。

一.正常Activity的生命周期

正常的生命周期是指,在用户正常参与情况下,Activity所经历的生命周期。

先来看看Activity的生命周期方法名

onCreate,onRestart,onStart,onResume,onPause,onStop,onDestroy

从命名上看,谷歌官方将这些生命周期方法名起的很方便记忆。

onCreate:创建

onRestart:重开始

onStart:开始

onResume:继续

onPause:暂停

onStop:停止

onDestroy:销毁

这些名称就像是我们生活中做一件任务或者事情一样。

首先,创建,开始,继续,随着事情的进展,有可能终止这件事情,则发展向:暂停、停止、销毁。

再如:当这件事情从终止到恢复,会经历继续(此时并不需要重新去创建和开始这件事情,因为上次已经发展了一些)。

这些过程中像是Activity的生命周期。

当用户打开一个新的Activity时,首先创建,然后开始,接着继续,当用户操作使得Activity要发生跳转时,此Activity暂停,如果用户在暂停这极短的时间内快速取消暂停,则又回到继续方法,否则,当前Activity进入停止,新的Activity创建,开始,继续。当用户按下返回键,或者Activity调用finish,则当前Acitivity需要被彻底销毁。

这一过程具体到每个生命周期的回调方法中

(1)onCreate:这是Activity生命周期的第一个方法,表示Activity正在被创建,在此时,可以做一些界面初始化的工作,如加载XML布局,初始化数据等。

(2)onRestart:表示Activity正在被重新启动。这个方法一般是用户按Home键回到桌面或者打开了一个新的Activity,并又重新回到这个Activity的情况,此时会调用onRestart方法。

(3)onStart:表示Activity正在被启动,准备开始,这时Activity已经可见了,但不在前台。即Activity已经显示出来了,但用户看不到。

(4)onResume:表示Activity可见了,并处于前台。

(5)onPause:表示Activity正在暂停,正常情况下,紧接着onStop会被调用,在极端理想特殊情况下,如果用户手速足够快,用户迅速的回到当前Activity,则onResume此时会被调用。在这个方法里的操作不能太耗时,因为在跳转的时候,只有当前Acitvity的onPause被执行完,新Activity的onResume才会被调用。

(6)onStop:表示Activity即将停止,不能太耗时

(7)onDestory:表示Activity即将被销毁,在这里做Activity里的资源释放。



正常情况几种情况的生命周期回调方法:

(1)打开一个Activity:onCreate->onStart->onResume

(2)当用户打开一个新的Activity或者切换到桌面:onPause->onStop.

当新的Activity采用透明主题,当前Activity不会onStop.

当 Activity 被另外一个 Activity 覆盖、失去焦点并不可见时处于 Stoped 状态。

当 Activity 被另一个透明或者 Dialog 样式的 Activity 覆盖时的状态。此时它依然与窗口管理器保持连接,系统继续维护其内部状态,所以它仍然可见,但它已经失去了焦点故不可与用户交互,所以被覆盖的Activity并不会执行onStop()方法.

(3)重新回到原Activity时,onRestart->onStart->onResume;

(4)按back返回键回退时,回调onPause,onStop,onDestory

对于生命周期里的方法,onStart,onStop以是否可见调用,onResume,onPause以是否位于前台调用。

二.异常Activity的生命周期

1.资源相关的系统配置改变导致Activity重建。

当系统配置发生改变之后,Activity会被销毁,其onPause->onStop->onDestory均会被调用,而onSaveInstanceState调用在onStop之前,可能发生在onPause之前,也可能发生在onPause之后。销毁完成后重建,将在onSavaInstanceState方法中保存的Bundle对象传给onCreate和onRestoreInstanceState,onRestoreInstanceState发生在onStart之后。

关于这两个方法,调用时期是这样的。

onSaveInstanceState方法会在什么时候被执行,有这么几种情况:

1、当用户按下HOME键时。

这是显而易见的,系统不知道你按下HOME后要运行多少其他的程序,自然也不知道activity A是否会被销毁,故系统会调用onSaveInstanceState,让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则

2、长按HOME键,选择运行其他的程序时。

3、按下电源按键(关闭屏幕显示)时。

4、从activity A中启动一个新的activity时。

5、屏幕方向切换时,例如从竖屏切换到横屏时。

在屏幕切换之前,系统会销毁activity A,在屏幕切换之后系统又会自动地创建activity A,所以onSaveInstanceState一定会被执行

总而言之,onSaveInstanceState的调用遵循一个重要原则,即当系统“未经你许可”时销毁了你的activity,则onSaveInstanceState会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据(当然你不保存那就随便你了)。

至于onRestoreInstanceState方法,需要注意的是,onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成对的被调用的,onRestoreInstanceState被调用的前提是,activity A“确实”被系统销毁了,而如果仅仅是停留在有这种可能性的情况下,则该方法不会被调用,例如,当正在显示activity A的时候,用户按下HOME键回到主界面,然后用户紧接着又返回到activity
A,这种情况下activity A一般不会因为内存的原因被系统销毁,故activity A的onRestoreInstanceState方法不会被执行

另外,onRestoreInstanceState的bundle参数也会传递到onCreate方法中,你也可以选择在onCreate方法中做数据还原

在销毁重建的过程中,view会保持自身的数据。如:Listview的滚动位置,EditText中的内容,onSaveInstanceSoate中,Acivity委托Window保存数据,Window委托上层容器保存数据,顶层是ViewGroup,顶层容器再一一通知子元素保存数据。

正常销毁时,不会调用onSaveInstanceState方法。只有异常终止时,才会调用onSaveInstanceState和onRestoreInstanceState.

2.内存不足时优先级低的Activity被系统杀死。

优先级的划分:

1.前台Activity,正在和用户交互的Activity

2.可见但非前台的Activity,比如弹出对话框,处于后台但可见。

3.后台Activity,已经被暂停了,执行onStop了。

数据存储和恢复与1相同。

3.配置改变后不重建Activity.

在xml中配置,configChanges值,如果只将其设为orientation时,还是会重建Activity,但是,当将其设置为orientation|screenSize时,这样当对应的系统配置发生改变后,会触发onConfigurationChanged方法,不会调用onSavaInstanceState,onRestoreInstanceState,不会重建。

附图,在一个Activity中启动另一个Activity时的生命历程。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: