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时的生命历程。
一.正常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时的生命历程。
相关文章推荐
- Android监听——回调模式与观察者模式
- Android中Handler源码解析(一)
- Android延迟执行PostDelayed
- UltimateAndroid
- android开发零基础入门教程
- Android - 文件读写操作 总结
- Android SDK Manager 更新代理配置
- 选择蜂窝教育Android培训 即可无忧学习
- android 实现FTPServices 文件传输,支持IPV6
- Android群英传笔记——第六章:Android绘图机制与处理技巧
- Android相对布局属性
- Android的Kotlin秘方(I):OnGlobalLayoutListener
- Qt for Android 中集成 ShareSDK
- Android ScrollView 去掉 scrollbar 和 阴影
- android5.0+(Toolbar)
- openCv 导入 android studio
- android手势滑动关闭当前activity
- Android Studio 打包、生成jks密钥、签名Apk、多渠道打包
- 关于android从入门到精通4.1.9范例1出现的闪退的问题
- Android屏幕自适应4种解决方案