生命周期的调用和回调过程:
- 在一个activity的生命周期中,系统会像金字塔模型一样去调用一系列的生命周期的回调方法。Activity生命周期的每一个阶段就像金字塔中的台阶。当系统创建了一个新的activity实例,每一个回调方法会向上一阶移动activity的状态。金字塔顶端意味着activity是跑在最前端的并且用户可以与它进行交互。
- 当用户开始离开这个activity,为了卸载这个activity,系统会调用其它方法来向下一阶移动activity状态。在某些情况下,activity会隐藏在金字塔下等待(例如当用户切换到其他app),这个时候activity可以重新回到顶端(如果用户回到这个activity)并且恢复用户离开时的状态。
另外,周期中有三个状态是相对静态的,这三个状态下activity可以存在一段比较长的时间。(其它状态会很快就切换掉,停留的时间比较短暂)
- Resumed:在这个状态,activity是在最前端的,用户可以与它进行交互。(通常也被理解为"running" 状态)
- Paused:在这个状态,activity被另外一个activity所遮盖:另外的activity来到最前面,但是半透明的,不会覆盖整个屏幕。被暂停的activity不会再接受用户的输入且不会执行任何代码。
- Stopped:在这个状态, activity完全被隐藏,不被用户可见。可以认为是在后台。当stopped, activity实例与它的所有状态信息都会被保留,但是activity不能执行任何代码。
其它状态 (Created and Started)都是短暂的,系统快速的执行那些回调方法并通过执行下一阶段的回调方法移动到下一个状态。也就是说,在系统调用onCreate(), 之后会迅速调用onStart(), 之后再迅速执行onResume()。上面就是基本的activity生命周期。
这些回调方法非常有用,Activity的子类可以在activity的生命周期状态发生关键性转换时,通过覆盖回调方法完成某些工作。
我们已经熟悉了这些方法中的onCreate(Bundle)方法。在创建activity实例后,但在此实例出现在屏幕上以前,Android操作系统会调用该方法。
通常,activity通过覆盖onCreate()方法来准备以下用户界面相关的工作:
- 实例化组件并将组件放置在屏幕上(调用方法setContentView(int));
- 引用已实例化的组件;
- 为组件设置监听器以处理用户交互;
- 访问外部模型数据。
永远不要自己去调用onCreate()方法或任何其他Activity生命周期方法,记住这一点很重要。我们只需在activity子类里覆盖这些方法即可,Android会适时去调用它们。
Activity生命周期中的一些注意点
1. Activity的onDestory()在Activity关闭时一定会被调用吗?
There are situations where the system will simply kill the activity's hosting process without calling this method (or any others) in it, so it should not be used to do things that are intended to remain around after the process goes away.
上面是官网的话,意思大概是,有很多情况下系统会简单的杀死这个Activity的宿主进程而不调用它的onDestroy方法,所以在这个方法中不要做任何有关保留数据或者状态的相关操作。
从官网生命周期图我们可以看到Activity有两个出口,onStop后有可能直接到 App process killed,而不执行onDestroy函数。
2. 按下home键后 Activity发生什么变化?
onPause –> onSaveInstanceState –> onStop
程序在后台的时候,选择主动杀死程序进程,然后再从桌面点击应用启动
onStart –>onRestoreInstanceState - > onResume
data-snippet-id=ext.985723908b317cdb0e47782db9856314 data-snippet-saved=false data-csrftoken=zE7kqcfS-rPA0pfTUkywJOuJi__ohA2zmfR0 data-codota-status=done> onCreate ->onStart –>onRestoreInstanceState - > onResume
直接从桌面点击应用启动呢?
onRestart –> onStart –> onResume
按下返回按键
onPause –> onStop –> onDestroy
3. onSaveInstanceState()和onRestoreInstanceState 方法是什么呢?
onSaveInstanceState() 和 onRestoreInstanceState()的作用:
在资源紧张的情况下,系统会选择杀死一些处于非栈顶的Activity来回收资源。 为了能够让这些可能被杀死的Activity能够在恢复显示的时候状态不丢失,所以需要在Activity从栈顶往下压的时候提供onSaveInstanceState的回调用来提前保存状态信息。
而onRestoreInstanceState则是在这个Activity真的回收掉之后的恢复显示阶段用来恢复之前保存的数据。
onSaveInstanceState与onRestoreInstanceState的调用时机:
只要某个Activity是做入栈并且非栈顶时(启动跳转其他Activity或者点击Home按钮),此Activity是需要调用onSaveInstanceState的, 如果Activity是做出栈的动作(点击back或者执行finish),,是不会调用onSaveInstanceState的。
只有在Activity真的被系统非正常杀死过,恢复显示Activity的时候,就会调用onRestoreInstanceState。
4. 屏幕旋转时,Activity执行了什么方法?
如果你不做任何配置
启动Activity会执行如下方法:
onCreate –> onStart –> onResume
之后旋转屏幕,则Activity会被销毁并重新创建,之后便会执行如下方法:
onSaveInstanceState –> onStop –> onDestroy –> onCreate –> onStart –> onRestoreInstanceState –> onResume
data-snippet-id=ext.853875dd1810fa8e66a574b85f570628 data-snippet-saved=false data-csrftoken=sLRS6Y1X-wXBfz4nAaIhM3QIxZeMeFW-y-AI
data-codota-status=done>onPause –> onSaveInstanceState –> onStop –> onDestroy –> onCreate –> onStart –> onRestoreInstanceState –> onResume
5. 屏幕旋转不重建Activity
在AndroidManifest配置文件里声明android:configChanges属性
sdk>13时需加上screenSize) data-snippet-id=ext.7c24116942ba8a2c3d69a054d026c5ad data-snippet-saved=false data-csrftoken=
aeVpge75-TL-szOrrtsoVWRMItyXjf5ZvJAI data-codota-status=done>android:configChanges=keyboardHidden|orientation|screenSize(sdk>13时需加上screenSize)
相关链接:
http://www.buhaoting.com/chengxu/yundongjianfei/shoushencao/103963.html
http://www.cnblogs.com/jlxuqiang/p/4749676.html