1、activity的生命周期
(1)、OnCreate()
第一次创建的时候调用。一般用来做一些出数据的操作。比如,加载布局,初始化事件。
(2)、OnStart()
在不可见准备变为可见的时候调用。
(3)、OnResume()
可见,并且有焦点交互的时候,这个时候,这个activity一定在返回栈的栈顶。并且处于运行状态。
(4)、OnPause()
系统准备去启动||恢复另外一个activity的时候调用,
(5)、OnStop()
在activity完全不可见的时候调用,一般在这里都会把一些在当前这个activity的耗损资源的一些操作释放了,和保存一些关键的数据。这个方法一定要快,不能超过10秒,否者系统就会报ARN了。
和上面的区别在,如果打开新的活动是一个dialog,那么OnPause会执行,onStop不会执行。
(6)、OnDestroy()finish的时候调用
销毁之前调用,之后这个activity的状态就是销毁状态了。
(7)、OnRestart()
由停止状态变为运行状态之前调用,就是重启的时候调用,
(8)、OnSaveInstanceState()
只有在activity即将销毁的时候,并且有机会重新显示的时候才会调用,正常生命周期不会调用。
2、onSaveInstanceState异常生命周期
(1)、异常生命周期在什么情况下被调用
当activity有可能被系统回收的情况下,而且是在onStop()之前。注意是有可能,如果是已经确定会被销毁,比如用户按下了返回键,或者调用了finish()方法销毁activity,则onSaveInstanceState不会被调用。
或者也可以说,此方法只有在activity被异常终止的情况下会被调用。
总结下,onSaveInstanceState(Bundle outState)会在以下情况被调用:
- 当用户按下HOME键时
- 从最近应用中选择运行其他的程序时
- 按下电源按键(关闭屏幕显示)时
- 从当前activity启动一个新的activity时
- 屏幕方向切换时(无论竖屏切横屏还是横屏切竖屏都会调用)
在前4种情况下,当前activity的生命周期为:
onPause -> onSaveInstanceState -> onStop。
3、onRestoreInstanceState什么时机被调用?
onRestoreInstanceState(Bundle savedInstanceState)只有在activity确实是被系统回收,重新创建activity的情况下才会被调用。
比如屏幕方向切换时,activity生命周期如下:
onPause -> onSaveInstanceState -> onStop -> onDestroy -> onCreate -> onStart -> onRestoreInstanceState -> onResume
在这里onRestoreInstanceState被调用,是因为屏幕切换时原来的activity确实被系统回收了,又重新创建了一个新的activity。
而按HOME键返回桌面,又马上点击应用图标回到原来页面时,activity生命周期如下:
onPause -> onSaveInstanceState -> onStop -> onRestart -> onStart -> onResume
因为activity没有被系统回收,因此onRestoreInstanceState没有被调用。
如果onRestoreInstanceState被调用了,则页面必然被回收过,则onSaveInstanceState必然被调用过。
4、onCreate()里也有Bundle参数,可以用来恢复数据,它和onRestoreInstanceState有什么区别?
因为onSaveInstanceState 不一定会被调用,所以onCreate()里的Bundle参数可能为空,如果使用onCreate()来恢复数据,一定要做非空判断。
而onRestoreInstanceState的Bundle参数一定不会是空值,因为它只有在上次activity被回收了才会调用。
而且onRestoreInstanceState是在onStart()之后被调用的。有时候我们需要onCreate()中做的一些初始化完成之后再恢复数据,用onRestoreInstanceState会比较方便。