深入剖析Activity的生命周期
深入剖析Activity的生命周期
代码下载https://github.com/wxyass/wcl-activity-lifecycle
注意: 下面的方法全部都是运行在MainActivity中
MainActivity正常启动
onCreate() → onStart() → onResume()
在执行onResume()方法之后,MainActivity页面已经具备与用户交互的功能了
按返回键时
onPause() → onStop() → onDestroy()
在执行onDestroy()方法之后,MainActivity页面已经完全销毁
不按返回键,而按Home键
onPause() → onSaveInstanceState() → onStop()
在执行onStop()方法之后,MainActivity页面已经由前台转入后台,对用户不可视.对于onSaveInstanceState()方法,在页面关闭时都会执行,但是非系统原因的关闭,不会执行默认的恢复数据操作,即onRestoreInstanceState()方法.
再次启动处在后台的MainActivity
onRestart() → onStart() → onResume()
由于间隔时间较短,系统未执行onDestroy()方法,不需要调用onCreate来创建页面,也不会执行onRestoreInstanceState()方法恢复状态
但当处于后台的MainActivity因内存不足被系统销毁,再次启动MainActivity时
onCreate() → onRestart() → onStart() → onRestoreInstanceState() → onResume()
当MainActivity跳转第二个Activity
MainActivity.onPause() → SecondActivity.onCreate() → SecondActivity.onResume() → MainActivity.onSaveInstanceState() → MainActivity.onStop()
在MainActivity页面的onPause()执行完成后,SecondActivity页面才能执行启动逻辑,SecondActivity启动完成后,才能执行MainActivity页面的剩余销毁工作,如onSaveInstanceState()和onStop().因为当前Activity页面仍在Activity栈中,并未出栈,则并未执行onDestroy()的方法
关闭SecondActivity页面,重新返回MainActivity页面
SecondActivity.onPause() → MainActivity.onRestart() → MainActivity.onStart() → MainActivity.onResume() → SecondActivity.onStop() → SecondActivity.onDestroy()
同样,在SecondActivity执行onPause()方法之后,MainActivity才开始自身的创建工作.因为SecondActivity位于Activity栈的栈顶,所以触发出栈操作,页面完全销毁,所以执行onStop()完成之后,会继续执行onDestroy()方法
当MainActivity跳转透明Activity时
MainActivity.onPause() → TranslateActivity.onResume() → MainActivity.onSaveInstanceState()
先执行完MainActivity页面的onPause()方法,再去执行TranslateActivity的启动逻辑,但执行完TranslateActivity启动逻辑后,MainActivity并不会执行onStop()方法,因为onPause()方法控制MainActivity是否具有交互功能,onStop()方法控制MainActivity是否可视,所以当MainActivity启动TranslateActivity页面,仅仅使其自身失去交互功能,并不影响其是否可视
关闭透明页面,重新恢复MainActivity页面
TranslateActivity.onPause() → MainActivity.onResume() → TranslateActivity.onStop() → TranslateActivity.onDestroy()
在TranslateActivity页面执行onPause()之后,MainActivity开始重建工作,因为启动TranslateActivity页面时,MainActivity仅仅失去交互功能,所以只调用onResume()恢复交互功能,并未执行onCreate(),onStart()方法去恢复可视,在MainActivity页面创建完成后, TranslateActivity执行自身的销毁流程,即onStop(),onDestroy().
屏幕旋转,导致MainActivity的生命周期变化
MainActivity.onPause → MainActivity.onSaveInstanceState() → MainActivity.onStop() → MainActivity.onDestroy() → MainActivity.onCreate() → MainActivity.onStart() → MainActivity.onRestoreInstanceState() → MainActivity.onResume()
当旋转手机时,MainActivity页面的生命周期被切换,先是执行页面的销毁生命周期过程流,然后是执行页面的创建生命周期过程流,注意 onSaveInstanceState()和onRestoreInstanceState()的调用时机.
另外:在AndroidManifest中的Activity属性中添加如下信息:
android:screenOrientation="portrait"
就会使屏幕保持竖直状态,Activity页面无法旋转,也无法监听旋转状态.避免系统在旋转屏幕时强制重构Activity,影响用户体验.