Activity生命周期
先附上一张官网的lifeCycle图:
-
onCreate()
activity正在被创建,可在该方法中做些初始化的操作(initViews,initData…)
-
onStart()
activity正在被启动,此时activity已经可见,但还未到前台,未能获取到焦点,不能与用户交互
-
onResume()
activity已经启动,已经到前台,已获取到焦点,可与用户交互
-
onPause()
activity可见但已不在前台,已丢失焦点,不能与用户交互
-
onStop()
activity即将停止,已不可见,可做些轻量级的回收工作
-
onRestart()
activity重新启动,如果用户按下home键或菜单键或熄屏后,再次重新打开该activity时会执行该方法
此时的生命周期为:onPause------onStop-----onRestart-----onStart-------onResume
-
onDestroy()
activity即将被销毁,在此方法中做释放资源等回收操作
以上是正常情况下的activity的生命周期,但是有时会出现一些异常情况导致activity被杀死。
异常情况下的生命周期
1.资源相关的系统配置发生变化导致activity被杀死并重新创建
比如当前activity是竖屏状态,如果旋转屏幕,由于系统配置发生了变化默认情况下activity会被销毁并重新创建。
onPause-------onSaveInstanceState(可能在onPause之前或之后)----------onStop--------onDestroy------onCreate----onStart--------onRestoreInstanceState------onResume
特别说明:onSaveInstanceState只有在activity异常终止的情况下,activity有可能被系统回收,该方法才会被调用。
以下情况下会被调用:
- 用户按下home键,菜单键,熄屏
- 旋转屏幕
在onSaveInstanceState和onRestoreInstanceState中系统自动做了一些保存恢复工作,比如文本框中用户输入的数据,RecyclerView滚动的位置等。关于保存和恢复view层次结构,系统采用的是委托思想,activity委托window保存数据,window再委托deccorView,一层一层的向下传递,类似于view的绘制流程,事件分发机制
2.资源内存不足导致优先级低的activity被杀死。
activity的优先级由高到低依次为:
前台activity-----------正在和用户交互的activity
可见但非前台activity-------------activity可见但是位于后台无法和用户交互,activity上弹出个Dialog
后台activity---------------已经执行了onStop
当系统内存不足时,系统会按照优先级的高低杀死目标activity所在的进程,并在后续通过onSaveInstanceState保存和恢复数据。