最近在面试的过程中,发现一些小朋友对Activity生命周期事件掌握的还不是特别牢固。当然,这里我指的不是单个Activity的生命周期事件,而是从一个Acitivty跳转到另外一个Activity的时候,2个Activity的生命周期事件是按照什么顺序发生的。
单个Activity的生命周期事件
这个大家都知道,在这里就简单列一下:
Activity启动的时候:onCreate() -> onStart() -> onResume()
Activity退出的时候:onPause()-> onStop()-> onDestroy()
从ActivityA跳转到ActivityB的生命周期事件
如果两个Activity事件搅和在一起,您能确定它们的事件顺序吗?
首先,看看从ActivityA跳转到ActivityB的事件:
从ActivityA跳转到ActivityB的事件
通过上图可以清晰的看到,当从ActivityA跳转到ActivityB的的时候,首先执行的是ActivityA的onPause()
方法,然后是ActivityB的一系列生命周期方法,最后再是ActivityA的onStop()
方法。ActivityA的onDestroy()
方法不会被调用。
看看用户从ActivityB返回ActivityA的情况:
从ActivityB返回ActivityA
ActivityB的onPause()
方法先被调用,然后是ActivityA的生命周期方法,当ActivityA的onResume()
执行之后,ActivityB的onStop()
和onDestroy()
会被调用。
生命周期事件背后的设计思想
其实,要记住以上事件的顺序不是什么难事。但是重要的是,我们需要考虑:Android为什么会这样设计?
为什么不管是跳转还是返回,都是当前Activity的
onPause()
方法先被调用?为什么不管是跳转还是返回,前一个Activity的
onStop()
方法总是在新的Activity的onResume()
方法后被调用?
其实,这背后隐藏着一个重要的Android设计思想:在任何时候,都是UI优先。保证用户体验永远是第一位的。
以跳转为例,当Activity发生跳转的时候,第一个事件肯定是要交给当前处于前台的ActivityA,这样可以保证UI事件可以第一时间执行。然后,再执行ActivityB的生命周期事件,当ActivityB已经出现在前台之后,再调用ActivityA的onStop()
方法,因为此时ActivityA已经在后台了,所以onStop()
不会影响到前台的用户体验。
onPause()和onStop()的区别
在日常开发中,很多同学对这两个方法都是混着用的,没有想的特别清楚。实际上,根据上面的分析,这两个方法还是有一定区别的:
首先,onPause()
方法是跳转前的第一个方法,所以在这个方法里面一定不能做耗时的操作,否则会影响下一个Activity的出现,让用户觉得不流畅。
而ActivityA的onStop()
方法被调用的时候,ActivityB已经在前台了,所以可以在onStop()
方法里做一些清理的工作,不会影响到用户的体验。
onSaveInstanceState()方法的调用时机
Android里onSaveInstanceState()
的调用时机也是让人比较困惑的事情。首先,onSaveInstanceState()
并不是Activity的生命周期方法,这意味着这个方法不是总会被调用的。只有在Activity可能会被系统销毁的时候才可能被调用。
拿上面的例子来说,从ActivityA跳转到ActivityB,ActivityA被压在ActivityB下面,这种情况可能会被系统销毁,所以onSaveInstanceState()
会被调用。如果在ActivityB的页面里用户按Home退出,onSaveInstanceState()
也是会被调用的。
相反的,如果用户在ActivityB页面按Back键返回ActivityA,此时,ActivityB的onSaveInstanceState()
是不会被调用的。
再说从ActivityA跳转到ActivityB的时候,还有个很奇怪的情况:
在Android P之前,ActivityA的onSaveInstanceState()
是在onStop()
之前被调用的,而且和ActivityA的onPause()
的调用谁先谁后不确定!
在Android P及之后,onSaveInstanceState()
是在onStop()
之后被调用的。
下面是官方的解释:
If called, this method will occur after
onStop()
for applications targeting platforms starting withBuild.VERSION_CODES.P
. For applications targeting earlier platform versions this method will occur beforeonStop()
and there are no guarantees about whether it will occur before or afteronPause()
.
总结
Android的生命周期方法,其实是很基础的知识。但是细抠的话,还是有不少细节的。
最后,还是拿这张大家都看过的图来镇楼:
Activity的生命周期
网友评论