后续会持续更新,建议收藏关注
当从 A 窗口打开 B 窗口时, B 窗口的 onResume 和 A 的 onPause 方法哪个先执行呢?
这道题想考察什么
这个实际上考察的是有没有自己去尝试测试过Activity的生命周期函数,如果仅仅是看出,简单地使用onResume函数,这道题是回答不上来的。
细分下来的知识点
- A打开B,A自身的生命周期如何执行,B的生命周期如何执行
- 从B回到A,又是怎么样的执行顺序
如何作答
1.启动 A onCreate - onStart - onResume
2.在 A 中启动 B ActivityA onPause ActivityB onCreate ActivityB onStart ActivityB onResume ActivityA onStop
3.从 B 中返回 A(按物理硬件返回键) ActivityB onPause ActivityA onRestart ActivityA onStart ActivityA onResume ActivityB onStop ActivityB onDestroy
4.继续返回 ActivityA onPause ActivityA onStop ActivityA onDestroy
上述是做过实验之后可以从日志里面直接得出的结果。经过总结分析得出:
从A到B时,A先pause,B必须要走完onCreate,onStart,onResume到了可交互的状态时,A才会交出控制权,到onStop。这样可以防止A过快消失导致用户看到B尚未就绪的尴尬状态。同样B回到A,也是要A走完onRestart-onStart-onResume,之后B才onStop。
形象一点理解,就是A-B的切换相当于舞台剧切换场景,幕布降下来之前,下一个场景必须完全就绪,不能是一个半成品状态。
如何保存Activity的状态(状态即数据)
这道题想考察什么
Activity 的状态通常情况下系统会自动保存的,只有当我们需要保存额外的数据,或者在特殊的情况下保存数据,才是这道题问的精髓。
细分下来的知识点
- 什么场景下Activity状态不用手动保存
- 什么场景下必须手动保存
- 重写哪个方法去保存数据
如何作答
一般来说, 调用 onPause()和 onStop()方法后的 activity 实例仍然存在于内存中, activity 的所有信息和状态数据不会消失, 当 activity 重新回到前台之后,所有的改变都会得到保留。但是当系统内存不足时, 调用 onPause()和 onStop()方法后的 activity 可能会被系统摧毁, 此时内存中就不会存有该 activity 的实例对象了。如果之后这个activity 重新回到前台, 之前所作的改变就会消失。为了避免此种情况的发生, 我们可以覆写 onSaveInstanceState()方法。onSaveInstanceState()方法接受一个 Bundle 类型的参数, 开发者可以将状态数据存储到这个 Bundle 对象中, 这样 即 使 activity 被 系 统 摧 毁 , 当 用 户 重 新 启 动 这 个 activity 而 调 用 它 的onCreate()方法时, 上述的 Bundle 对象会作为实参传递给 onCreate()方法, 开发者可以从 Bundle 对象中取出保存的数据, 然后利用这些数据将 activity 恢复到被摧毁之前的状态。需要注意的是, onSaveInstanceState()方法并不是一定会被调用的, 因为有些场景是不需要保存状态数据的. 比如用户按下 BACK 键退出 activity 时, 用户显然想要关闭这个 activity, 此时是没有必要保存数据以供下次恢复的, 也就是onSaveInstanceState()方法不会被调用. 如果调用 onSaveInstanceState()方法, 调用将发生在 onPause()或 onStop()方法之前。
横竖屏切换时Activity的生命周期
这道题想考察什么
除了一般情况下的生命周期函数调用顺序之外,横竖屏切换,系统也会根据app的设置让生命周期函数的调用顺序有所不同。
细分下来的知识点
- 如何配置横竖屏切换设置
如何作答
此时的生命周期跟清单文件里的配置有关系。
1.不设置 Activity 的 android:configChanges 时,切屏会重新调用各个生命周期默认首先销毁当前 activity,然后重新加载
2.设置 Activity android:configChanges="orientation|keyboardHidden|screenSize" 时,切换不会重新调用各个生命周期函数,只会执行onConfigurationChanged方法。