最近在准备面试,又碰到这一题,这已经是第三次了
Activity A跳转Activity B,再按返回键,A、B的生命周期执行顺序是什么?
每当听到这个题目的时候,我就会得意地笑,对于Activity的生命周期已经记熟的我,心想,为什么不直接问Activity的生命周期呢?于是自信满满的说出了如下的答案:
在A跳转B会执行:A onPause -> A onStop -> B onCreate -> B onStart -> B onResume
在B按下返回键会执行:B onPause -> B onStop -> B onDestroy -> A onRestart -> A onStart -> A onResume
正当我以为他会问点别的的时候,他吸了一口气说到,你下去多看看生命周期吧...
什么?我回答错了?回到家中我赶忙打开AS验证了一下,我是万万没有想到...结果如下:
首先打开A
在A跳转到B
然后在B按下返回键
What ????从log日志可以看出
当A跳转到B的时候,A先执行onPause,然后居然是B再执行onCreate -> onStart -> onResume,最后才执行A的onStop!!!
当B按下返回键,B先执行onPause,然后居然是A再执行onRestart -> onStart -> onResume,最后才是B执行onStop -> onDestroy!!!
原因:
要理解为什么会这样,下面这张图已经给我们解释的明明白白了。
-
A跳转B
当调用startActivity时,向当前栈中添加activityB, activityA 会执行 onPause,此时 activityA 处于失去焦点但可见的状态,因为 activityB 还没开始绘制,所以activityA不会回调 onStop方法,接着 activityB 会开始执行 onCreate -> onStart -> onResume ,我们都知道Activity 是在 onResume 中开始绘制界面,当 activityB执行完 onResume后,此时 activityA 处于不可见的状态,即按图上所示,activityA 会回调 onStop 方法。这也就是在activityA 跳转 activityB 时,A的onStop 最后执行。
-
B 返回 A
同理,在activityB中按下返回键,activityB会先执行 onPause ,此时B还处于可见状态,A 会执行 onRestart -> onStart -> onResume ->,此时A 已经处于可见状态了,B 不可见,开始执行 onStop -> onDestroy 方法。这样解释就正确了!
情况二:如果 ActivityB 为 dialog 式或者 半透明背景呢?给你三秒钟考虑一下~
3...
2...
1...
如果上面那张图你看懂了,那答案就很简单了。
当A跳转到B的时候,A先执行onPause,然后居然是B再执行onCreate -> onStart -> onResume。(注意:A的 onStop 不会执行)
当B按下返回键,B先执行onPause,然后是A只会执行 onResume,最后 B 执行onStop -> onDestroy。
只要记住,只要 activity 处于可见的状态,就不会执行 onStop 方法!!(The activity is no longer visible !!!)即当前 activity 再也不可见了,才会回调 onStop 方法!!感兴趣可以看我这篇文章:Android面试题-来说一遍View的绘制流程
这道题我面试目前碰到了4次,直到第三次我才意识到问题的严重性,我说怎么有些面试让我回去等通知,等着等着就没信了。希望你们不要和我一样栽在这道题上...