Activity生命周期面试常用问题
本篇文章我将讲解Android有关生命周期的常见面试题,一般常见的问题都可以参考于开发者文档的这个图。
1.A Activity 跳转到 B Activity, 会经历哪些生命周期?
这个问题相信很多人都能轻松的回答,顺序依次为:
A.onPause -> B.onCreate -> B.onStart -> B.onResume -> A.onStop;
但是这就是最标准的答案吗?当然不是,在这里我们没有考虑到B的launchMode。
如果B的launchMode为singleTop并且B已经在栈顶了,那么实际经过的生命周期应该为:
B.onPause -> B.onNewIntent -> B.onResume;
如果B的launchMode为singleTask或者是singleInstance,并且栈中都有可以复用的Activity,那么经过的生命周期应该为:
A.onPause -> B.onNewIntent -> B.onRestart -> B.onStart -> B.onResume -> A.onStop;
2.弹出Dialog对生命周期的影响?
对于一般情况弹出Dialog、Toast、PopupWindow本质上都是直接通过WindowManager.addView()实现的,所以对它们对生命周期并没有什么影响。
然而如果一个Theme为Dialog的Activity弹出,则生命周期应该为:
A.onPause -> B.onCreate -> B.onStart -> B.onResume;
可以看到A并没有调用onStop(),这是因为A此时仍然为可见的,所以并不会回调onStop();
3.onActivityResult会在那两个生命周期之间回调
这个问题直接给答案了,读者有兴趣的可以直接去试验一下:onActivityResult会先于所有的生命周期被调用,从B Activity 返回到A Activity的生命周期为:
B.onPause -> A.onActivityResult -> A.onRestart -> A.onStart -> A.onResume;
4.onCreate方法中写死循环会ANR吗?
首先我们要了解到ANR的四种场景:
1.Service Timeout: service 未在规定的时间内完成:前台服务20s,后台服务200s。
2.BroadCastQueue TimeOut: 未在规定时间内处理完广播:前台广播10s内,后台60s内。
3.ContentProvider TimeOut: publish未在10s内完成。
4.Input Dispatching Timeout: 5s内未响应键盘输入、触摸屏幕等事件。
很明显onCreate并不是在以上四种情况中,所以并不能触发ANR,只不过会阻塞主线程。