面试必问之Android界面跳转时的生命周期

简单介绍一下后面用到的 Activity:

  • FirstActivity:当前 App 的默认启动 Activity。界面中包含一个点击可跳转到 SecondActivity 的 button。
  • SecondActivity:上面 FirstActivity 跳转的 Activity,界面包含一个点击 finish 当前 Activity 的 button。

很简单。
在这里插入图片描述
咱们先看一下 android 界面跳转时候的这两个 Activity 协同生命周期回调。

//App启动时,进入FirstActivity
2019-12-16 14:55:45.140 22287-22287/com.gas.test E/FirstActivity: OnCreate
2019-12-16 14:55:45.193 22287-22287/com.gas.test E/FirstActivity: onStart
2019-12-16 14:55:45.198 22287-22287/com.gas.test E/FirstActivity: onResume

//点击FirstActivity页面的跳转Button。
//可以清楚的看到先执行 FirstActivity#onPause 方法后,在运行 SecondActivity 的生命周期。
2019-12-16 15:08:30.679 22287-22287/com.gas.test E/FirstActivity: onPause

2019-12-16 15:08:30.772 22287-22287/com.gas.test E/SecondActivity: OnCreate
2019-12-16 15:08:30.825 22287-22287/com.gas.test E/SecondActivity: onStart
//走到 onResume 回调后,此时 SecondActivity 可以进行控件点击操作。
2019-12-16 15:08:30.830 22287-22287/com.gas.test E/SecondActivity: onResume

//当 SecondActivity 走完 onResume 方法后,才会执行 FirstActivity 的 onStop 方法。
2019-12-16 15:08:31.397 22287-22287/com.gas.test E/FirstActivity: onStop

//点击 SecondActivity finish Button,SecondActivity先回调 onPause 。
2019-12-16 15:25:38.693 22287-22287/com.gas.test E/SecondActivity: onPause
//然后走 FirstActivity onRestart、onStart、onResume
2019-12-16 15:25:38.721 22287-22287/com.gas.test E/FirstActivity: onRestart
2019-12-16 15:25:38.729 22287-22287/com.gas.test E/FirstActivity: onStart
2019-12-16 15:25:38.736 22287-22287/com.gas.test E/FirstActivity: onResume
//和原先跳转 SecondActivity 逻辑相同,都是等到要进入前台的 Activity 的 onResume 方法回调完成,
//在进行退出的 Activity 的生命周期的回调处理。
2019-12-16 15:25:39.286 22287-22287/com.gas.test E/SecondActivity: onStop
2019-12-16 15:25:39.294 22287-22287/com.gas.test E/SecondActivity: onDestroy
//此时 FirstActivity 进入前台并可进行操作。

跳转主要流程可以概括为:(方便记忆:A 为 FirstActivity,B 为 SecondActivity)

(A)onPause→(B)onCreate→(B)onStart→(B)onResume→(A)onStop

可以看到在跳转的时候:

都会先走完原先界面的 pause 方面,在走新 Activity 的生命周期,直到走完新生成页面的 resume 方法。
当前界面finish的时候,也是先走完当前界面的 pause方法。

核心就是先执行 resume 和 pause 的回调再去切换做别的事情。

在这里插入图片描述

为什么研究这种协同的生命周期?

官方解释:您可以利用这种可预测的生命周期回调顺序管理从一个 Activity 到另一个 Activity 的信息转变。

例如,如果您必须在第一个 Activity 停止时向数据库写入数据,以便下一个 Activity 能够读取该数据,则应在 onPause() 而不是 onStop() 执行期间向数据库写入数据。

为什么要等到 onPause 执行后再去做执行新 Activity 的生命周期?

  • 一个Activity或多或少会占有系统资源,而在官方的建议中,onPause方法将会释放掉很多系统资源,为切换Activity提供流畅性的保障,而不需要再等多两个阶段,这样做切换更快。
  • 按照生命周期图的表示,如果用户在切换Activity的过程中再次切回原Activity,是在onPause方法后直接调用onResume方法的,这样比onPause→onStop→onRestart→onStart→onResume要快得多。
发布了206 篇原创文章 · 获赞 68 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/u013728021/article/details/103562882