深入剖析Activity的生命周期

作者: wxyass 分类: Android 发布时间: 2017-08-25 00:04

深入剖析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,影响用户体验.

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注