面试题总结
- 问onStart(),与onResume()有什么区别?
onStart()是activity界面被显示出来的时候执行的,用户可见,包括有一个activity在他上面,但没有将它完全覆盖,用户可以看到部分activity但不能与它交互
onResume()是当该activity与用户能进行交互时被执行,用户可以获得activity的焦点,能够与用户交互。
onStart()通常就是onStop()(也就是用户按下了home键,activity变为后台后),之后用户再切换回这个activity就会调用onRestart()而后调用onStart()
onResume()是onPause()(通常是当前的acitivty被暂停了,比如被另一个透明或者Dialog样式的Activity覆盖了),之后dialog取消,activity回到可交互状态,调用onResume()。
- 什么情况下Activity走了onCreat(),而不走onStart()
我们在onCreate()里面加了super.onStop();或super.onDestroy();,这样执行到onCreate()函数时,执行流程是这样的:onCreate -> onStop或onDestroy -> onStart -> onResume。最终还是会执行onStart。而如果加上finish(),则onCreate -> onDestroy,而不会执行onStart。
- 分别在onCreate / onStart / onResume 里面调用finish,生命周期怎么调用
如果Activity在onResume(可见)之前就需要被销毁时,onPause(不可见)也也不会执行;
如果Activity在onStart(开始)之前就需要被销毁时,onStop(停止)也不会执行;
- 假设项目中有这样的需求,当指定的 Activity 在用户可见后才进行广播的注册,在用户不可见后对广播进行注销,那应该在哪两个回调中做这个处理呢?
认真看了上面的解释的童鞋肯定都比较清楚。问题中强调了「可见」和「不可见」,所以我们只需要注重可见生命周期,在Activity 启动后,会先调用
onCreat()
方法进行布局和想关事件的绑定,直到回调onStart()
方法后活动才可见,所以直接回答onStart()
和onStop()
即可。
- 如果有一些数据在 Activity 跳转时(或者离开时)要保存到数据库,那么你认为是在 onPause() 好还是在 onStop() 执行这个操作好呢?
熟悉 Activity 的生命周期的我们都知道,onPause() 相比 onStop() 更容易触发。而「数据」就是 APP 甚至互联网产品的根,我们虽然绝大多数情况下都会遵从 onPause() =onStop() 的原则,但我们实在难以保证每次运行都能正常运行到 onStop() 方法,比如还没运行到 onStop() 系统就被回收了。
值得注意的是,这个操作要尽量地快,不然肯定会影响到下一个 Activity 的生命周期的。
- Activity A 启动了 Activity B,简单说下它们分别的生命周期的变化。
- Activity A 通过 Intent 显示启动了 Activity B,当 B 处于可见状态后,A 是否一定会调用 onStop()?
这两个问题其实考察的点基本一致,大概就想考察面试者是否认为只要最上层栈顶的 Activity B 处于可见状态,那下面一层的 Activity A 就一定会调用 onStop() 方法。
如果直接照第四个问题的方式提问你,你就算认定一定会调用,但你也会被问的怀疑人生。但由于你觉得一定调用 onStop() 方法,并且你也找不到不调用的情况,所以你很耿直的回答了一定会调用。
实际上却并不是一定会调用,我们上面也说了,Activity 调用 onStop() 的时期是该 Activity 处于完全不可见状态,所以我们只需要想办法举出还可见的状态就好了。
我们假设弹出一个对话框形式的 Activity B,甚至就算弹出一个正常的 Activity B,把 B 的页面设置较低的透明度,实际上是一样的效果,不信你去打印日志试试。