面试题: 怎么理解Activity的生命周期?
这是一道几乎必问的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体系,顺应它的道(机制)开发应用也是一种能力。
网友评论
onCreate()-> onStart () -> onResume() -> onPouse()->onStop()->onDestroy()
如果一个Activity在用户可见时才处理某个广播,不可见时注销掉,那么应该在哪两个生命周期的回调方法去注册和注销BroadcastReceiver呢?
onStart(),onPouse()
如果有一些数据在Activity跳转时(或者离开时)要保存到数据库,那么你认为是在onPause好还是在onStop执行这个操作好呢?
onPouse(),更容易被触发
简单说一下Activity A启动Activity B时,两个Activity生命周期的变化?
A onResume()->onPouse()->onstop()
B onCreate()-> onStart()->onResume()
A-onPause
B-onCreate-onStart
A-onStop
B-onResume
因为B调用onStart之后就可见了,那么A应该就不可见了,所以此刻A应该会调用onStop
但事实证明不是这样。。。
Activity生命周期中的7个方法,四大状态(可见、可见不可操作、不可见、销毁)。
onCreat() -> onStart() -> [可见不可操作] -> onResume() -> [可操作] -> onPause() -> [可见不可操作] -> onStop() -> [不可见] -> onDestroy() -> [销毁]