小菜前段时间整理过一些关于 Activity 与 Fragment 生命周期的小博文:Android7.0 分屏下 Activity 与 Fragment 生命周期(一) 和 我们真的了解 Activity 与 Fragment 的生命周期吗?今天继续这个话题,稍稍整理一下,在 Android7.0 分屏情况下,两个 Activity 的生命周期之间的执行顺序,且同样暂不研究横竖屏切换时的过程。
小菜根据输出的两个 Demo 生命周期简单整理一下交互间的执行顺序。
小菜操作步骤如下:
-
首次启动初始化 ACE09_1,其执行生命周期为:onCreate -> onStart -> onResume;
-
点击手机的【任务键】, ACE09_1 其执行生命周期为:onPause -> onStop;
-
将 ACE09_1 进行分屏操作,占据屏幕一半,其执行生命周期为:onDestroy -> onCreate -> onStart -> onResume -> onPause;
-
操作屏幕未挡住的下半部分,首次启动初始化 ACE09_2,其执行生命周期为:onCreate -> onStart -> onResume;若 ACE09_2 已启动处于后台,则此时生命周期为:onDestroy -> onCreate -> onStart -> onResume;
-
此时点击 ACE09_2 不会执行任何生命周期,因为此时 ACE09_2 是最新的操作页面;但若点击 ACE09_1 屏幕时,执行的生命周期为:ACE09_2 onPause -> ACE09_1 onResume;此时 ACE09_1 处于 onResume 状态,ACE09_2 处于 onPause 状态,若再点击 ACE09_2 屏幕时,执行生命周期为:ACE09_1 onPause -> ACE09_2 onResume;
-
此时 ACE09_1 与 ACE09_2 分别占据屏幕的一半,调整屏幕比例,ACE09_1 屏幕范围超过手机屏幕一半,此时响应的 ACE09_2 占据剩余不足半个手机屏幕范围,此时生命周期:ACE09_1 (onPause ->) onStop -> onDestroy -> onCreate -> onStart -> onResume -> onPause;若调整的是 ACE09_2 屏幕范围超过手机屏幕一半,执行的则是 ACE09_2 的生命周期,与刚才一致。重点是 onPause 是否执行,则需要看哪个 Activity 的当前状态,若处于 onResume 状态则先执行 onPause,若正好处于 onPause 状态则不再执行 onPause 状态。
-
此时两个 Activity 处于一个大于手机屏幕一半,另一个占据另一部分,若调整屏幕范围,使两个 Activity 各占据手机屏幕一半,其执行生命周期为:(onPause ->) onStop -> onDestroy -> onCreate -> onStart -> onResume;执行的生命周期是屏幕范围占据超过手机屏幕一半的 Activity,同样 onPause 是否执行则需要看哪个 Activity 的当前状态,若处于 onResume 状态则先执行 onPause,若正好处于 onPause 状态则不再执行 onPause 状态。
-
由第 6 步后,调整屏幕分割线,使占据屏幕超过一半的 Activity 与少于屏幕一半的 Activity 对调,Demo 测试 ACE09_1 占据屏幕由大到小,其执行顺序为:ACE09_2
onPause -> onStop -> ACE09_1 onStop -> ACE09_2 onDestroy -> ACE09_1 onDestroy -> ACE09_2 onCreate -> onStart -> onResume -> ACE09_1 onCreate -> onStart -> onResume -> onPause;
Tips:
<1> 此时的生命周期的执行顺序并不是绝对的,优先执行哪个 Activity 生命周期需要看这个 Activity 是否处于 onResume 状态;
<2> 两个 Activity 都需要先销毁完成后,再重新绘制;而在销毁和创建过程中,两个 Activity 的生命周期是交互进行的,并非先执行完一个以后在执行另一个 Activity 的生命周期。 -
测试 ACE09_1 在屏幕上半部分,ACE09_2 处于屏幕下半部分,调整屏幕分割线,将处于下半部分的 Activity 划到底部,只留下上半部分 Activity,此时生命周期为:ACE09_1 onStop -> onDestroy -> onCreate -> onStart -> onResume -> onPause -> ACE09_2 onPause -> onStop -> ACE09_1 onResume,其生命周期并不绝对,是两个 Activity 交互执行;调整屏幕分割线,将处于上半部分 Activity 划到顶部,只留下下半部分 Activity,此时生命周期为:ACE09_2 onPause -> onStop -> onDestroy -> onCreate -> onStart -> onResume -> ACE09_1 onStop。
-
点击手机【分屏】按键,会将处于屏幕下半部分的 Activity 关闭,执行周期为:onPause -> onStop;
- ACE09_2 处于屏幕下半部分,且处于 onResume 状态,此时点击屏幕【返回】按键,此时 ACE09_2 会销毁,而 ACE09_1 不变,不会占据整个屏幕,此时生命周期为:ACE09_2 onPause -> onStop -> onDestroy;若 ACE09_2 处于屏幕下半部分,且 ACE09_1 处于 onResume 状态,此时点击屏幕【返回】按键,此时 ACE09_1 会销毁,且 ACE09_2 会占据整个屏幕范围,其执行周期为:ACE09_1 onPause -> ACE09_2 onResume -> ACE09_1 onStop -> onDestroy -> ACE09_2 onPause -> onStop -> onDestroy -> onStart -> onResume。
下面的是小菜的公众号,欢迎闲来吐槽哦~