美文网首页Android进阶之路Android开发经验谈Android技术知识
Android:Activity生命周期事件的几个小细节

Android:Activity生命周期事件的几个小细节

作者: 我爱纽约先生 | 来源:发表于2019-12-15 00:01 被阅读0次
    Activity跳转生命周期事件您清楚吗?

    最近在面试的过程中,发现一些小朋友对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 with Build.VERSION_CODES.P. For applications targeting earlier platform versions this method will occur before onStop() and there are no guarantees about whether it will occur before or after onPause().

    总结

    Android的生命周期方法,其实是很基础的知识。但是细抠的话,还是有不少细节的。

    最后,还是拿这张大家都看过的图来镇楼:


    Activity的生命周期

    相关文章

      网友评论

        本文标题:Android:Activity生命周期事件的几个小细节

        本文链接:https://www.haomeiwen.com/subject/dqxhnctx.html