这是一道几乎必问的Android面试题,当听到这题时大家的神经都会麻木,你问我背。说实话,如果你问我怎么理解,我也很难回答,因为这个问题太宽泛了,答什么都可以又答什么都难答好。有一次电话面试问了一个人,对方直接说不要问这种在网上到处都能看到的题,他只要上网一查就会。好吧,我脾气好,就接着问:
“那问什么题呢?”
“逻辑的,算法的,业务什么的,就是纯JAVA代码的。”
“那么熟悉什么算法呢?”
“。。。”(没答上)
但Activity的生命周期又至关重要,不问好像又对不起彼此。根据得到的反馈我后来稍稍改变了一下提问方式,不问怎么理解,而是给几个场景问怎么使用回调或回调的顺序(或要注意什么),从侧面看是否真正理解了。
下面还是先过一下官网上的Activity生命周期图,注意几个框线其实代表又可以细分为不同的周期。
如果一个Activity在用户可见时才处理某个广播,不可见时注销掉,那么应该在哪两个生命周期的回调方法去注册和注销BroadcastReceiver呢?
Activity 的可见生命周期发生在 onStart调用与 onStop调用之间。在这段时间,用户可以在屏幕上看到 Activity 并与其交互。我们可以在 onStart中注册一个 BroadcastReceiver以监控影响 UI 的变化,并在用户无法再看到您显示的内容时在 onStop中将其取消注册。
如果对方回答是在onResume和onPause方法中,那么你可以去引导对方看看在这两个方法有什么不好的地方。
如果有一些数据在Activity跳转时(或者离开时)要保存到数据库,那么你认为是在onPause好还是在onStop执行这个操作好呢?
这题的要点和上一题是一样的,onPause较容易被触发,所以我们在做BroadcastReceiver注销时放在onStop要好些。onPause时Activity界面仍然是可见的,如弹出一个Dialog时。但在保存数据时,放在onPause去做可以保证数据存储的有效性,如果放在onStop去做,在某些情况下Activity走完onPause后有可能还没顺利走到onStop就被系统回收了。
但要注意在onPause中要非常迅速地执行完所需操作,不然会影响到下一个Activity的生命周期函数的调用。
简单说一下Activity A启动Activity B时,两个Activity生命周期的变化。
当一个 Activity 启动另一个 Activity 时,它们都会发生生命周期转变。第一个 Activity 暂停然后停止(但如果它在后台仍然可见,则不会停止,比如B是半透明的),系统会创建另一个 Activity。 如果这两个Activity 共用保存数据到文件或者数据库,必须要注意,在创建第二个 Activity 前,第一个 Activity 不会完全停止。更确切地说,启动第二个 Activity 的过程与停止第一个 Activity 的过程存在重叠。
以下是当 Activity A 启动 Activity B 时一系列操作的发生顺序:
Activity A 的 onPause方法执行。
Activity B 的 onCreate、onStart和 onResume方法依次执行。
然后,如果 Activity A 在屏幕上不再可见,则其 onStop方法执行。
您可以利用这种可预测的生命周期回调顺序管理从一个 Activity 到另一个 Activity 的信息转变。 例如,如果您必须在第一个 Activity 停止时向数据库写入数据,以便下一个 Activity 能够读取该数据,则应在 onPause而不是 onStop执行期间向数据库写入数据。
小结
这几个问题看似简单,其实还是很能问出面试者是否真正理解Activity生命周期的转变。经常有人会问,知道这些有什么用?又不能提升编程能力?编程能力是一个很复杂的体系,不能光看有技术含量或者高大上的算法才叫有能力,和悟道一样,我认为认识理清Android体系,顺应它的道(机制)开发应用也是一种能力。
最后
在现在这个金三银四的面试季,我自己在网上也搜集了很多资料做成了文档和架构视频资料免费分享给大家【包括高级UI、性能优化、架构师课程、NDK、Kotlin、混合式开发(ReactNative+Weex)、Flutter等架构技术资料】,希望能帮助到您面试前的复习且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。
网友评论