再谈Activity生命周期(详细)
@(Android基础)[Android全程实录读书笔记]
Activity的3中状态:
- 激活: 完全显示在界面上, 并且有焦点, 即正在与用户交互
- 暂停: 不完全显示, 没有焦点. 即被半透明或者其他Activity遮挡.
- 停止: 完全不现实, 没有焦点. 即完全被其他activity遮挡, 被压入activity的栈中
Activity的7个生命周期方法:
- onCreate()
- onStart()
- onResume()
- onRestart()
- onPause()
- onStop()
- onDestroy()
其中:
onCreate() 和 onDestroy() 对应
onStart() 和 onStop() 对应
onResume() 和 onPause() 对应
onReStart(): 在 停止状态到激活状态时会被调用. 如果是暂停状态到激活状态则不会调用
onSaveInstanceState(): 用来保存临时状态, 会在非主动, 从激活到暂停状态会调用, 也就是说点击back键主动退出是不会调用的, 但是点击home键到停止状态非主动会调用.
来看几个典型的例子:
- 程序启动:
onCreate() -> onStart() -> onResume() - 程序结束: 点击back键退出
onPause() -> onStop() -> onDestroy() - 程序启动后,点击home键回到桌面:
onPause() -> onSaveInstanceState() -> onStop()
这个时候再进入:
onRestart() -> onStart() -> onResume() - 程序启动, 弹出一个对话框, 进度条是不会调用生命周期的
- 程序启动, 跳转到第二个activity(全屏), 再跳转回来. 生命周期效果和点击home键到桌面是一样的.
如果第二个Activity的Theme被设置为对话框, 那么就会出现 暂停状态, 生命周期为:
onPause() -> onSaveInstanceState()
恢复
onResume()
生命周期图:
还有几个注意点:
- onSaveInstanceState()是保存临时状态, 不会总被调用, 所以不能用它来保存持久性数据. onPause() , onStop(), onDestroy() 状态的activity都可能随时被系统回收, 所以最好在 onPause() 方法中保存在与用户交互前更改的数据.
- 关于 onSaveInstanceState() 和 onRestoreInstanceState(), 这两个方法不一定是成对调用的. onSaveInstanceState() 会在activity容易在进入容易被系统回收的情况下调用. onRestoreInstanceState() 会在当activity已经被销毁(这里的销毁是activity在被系统自动回收的情况, 而非主动退出.) ,再次击进入应用的时候. 例如在程序启动后, 点击home键, 这时activity会进入onStop(), 这个时候使用手机的内存清理, 系统会回收掉目前未显示的所有Activity, 这时再重新启动应用, 就会调用: onRestoreInstanceState().
生命周期为: onCreate() -> onStart() -> onRestoreInstanceState() -> onRsume(). 所以其实我们还可以将: onRestoreInstanceState() 写到 onCreate() 中效果也一样. 都是从 savedInstanceState这个bundle中获取数据.