首页 > 编程知识 正文

service生命周期,android笔试题及答案

时间:2023-05-05 03:13:04 阅读:110203 作者:3117

今天我们一起来看看五个Activity生命周期的面试问题。 看完之后面试官问相关的问题,我相信你会有自信的。

activity被系统杀死了。 要去destory进程吗? 使用小米11的实验结论:

从MainActivity打开BActivity时,从下向上滑动返回到桌面,然后单击“系统清理”,在BActivity的onDestroy中行走;

从MainActivity打开BActivity时按“BActivity”按钮返回MainActivity,然后从下向上滑动返回桌面,单击“清理系统”以打开行走的MainActivity

也就是说,只有最后一次显示的activity的onDestroy生命周期会进行,其他activity的onDestroy不会被召回。

A当activity打开B Activity时会发生什么生命周期回调? 我想这个问题很多同学都遇到过。 简单的a.on pause-b.on crete-b.onstart-b.on resume-a.onstop.naive! 这样回答的只有及格分数。 因为只有在标准或B Activity中没有可重用的实例时,B Activity的launchMode才会出现这种情况。

在B Activity launch mode为singleTop、b activity已经位于堆栈顶部的情况下(通知栏的点击、连击等特殊情况),此时,只有b页面自身有生命周期的变化: b.on

如果B Activity的launchMode是singleInstance,而singleTask的相应B Activity具有可重用的实例,则生命周期回调将返回这样的: a.on pause-b (如果a已从堆栈中移出,则还有另一个A.onDestory。

回答几个情况会有好处。 同时,也要准备谈谈launchMode。

onAttachedToWindow )被召回时,能得到View的宽度的高度吗? 此时View是否已测量并绘制? 尝试为日志打印创建Demo。

是的,没有。 我们只有在onWindowFocusChanged回调的时候才能真正得到View的宽值。 因此,请参阅在 Activity 的 onAttachedToWindow() 回调之后,布局中的 View 会回调 onAttachedToWindow() ,然后才会去进行测量和绘制等。那么我们要获取一个 View 的宽高就最好是 View.post() 了。

如果不设置标志,context.startActivity ()是否一定会崩溃? 33559 www.Jian Shu.com/p/d29d 4669 a6ee

如果使用非activity start activity (),则必须指定Intent.FLAG_ACTIVITY_NEW_TASK。 如果未指定,则直接操作会抛出异常。 正确的代码是:

valintent=intent(this,main2activity :3360 class.Java (intent.flags=intent.flag _ activity _ new _ taskappplate

application context.start activity (intent (this, main2activity : class.Java ) ) ) )弹出故障对生命周期的影响,所有生命周期回调都由AMS响应PopupWindow本质上直接显示在WindowManager.addView () ),因此不通过AMS ) )的生命周期没有任何影响。

如果Theme启动Dialog的Activity,则生命周期为a.on pause-b.on crete-b.onstart-b.on resume, 因为我们注意到,如果没有以前的Activity,就不会回调onStop。如果弹出Dialog主题的Activity,仍然可以看到上一页,但只是失去了焦点,所以只有onPause回调。

为什么Activity会显示在onResume之后? 设置Activity的布局一般是通过onCreate方法调用setContentView。 李

面是直接调用 window 的 setContentView,创建一个 DecorView 用来包住我们创建的布局。详情如下:

PhoneWindow.javapublic void setContentView(int layoutResID) { if (mContentParent == null) { installDecor(); } ... // 加载布局,添加到 mContentParent // mContentParent 又是 DecorView 的一个子布局 mLayoutInflater.inflate(layoutResID, mContentParent);}

然而这一步只是加载好了布局,生成一个 ViewTree , 具体怎么把 ViewTree 显示出来,答案就在下面:

ActivityThread.javapublic void handleResumeActivity(...){ // onResume 回调 ActivityClientRecord r = performResumeActivity(...) final Activity a = r.activity; if (r.window == null && !a.mFinished && willBeVisible) { r.window = r.activity.getWindow(); View decor = r.window.getDecorView(); ViewManager wm = a.getWindowManager(); wm.addView(decor, l);// 重点 }}

WindowManager 的 addView 方法最终将 DecorView 添加到 WMS ,实现绘制到屏幕、接收触屏事件。具体的调用链如下:

WindowManagerImpl.addView-> WindowManagerGlobal.addView-> ViewRootImpl.setView -> ViewRootImpl.requestLayout() // 执行 View 的绘制流程 // 通过 Binder 调用 WMS ,WMS 会添加一个 Window 相关的对象 // 应用端通过 mWindowSession 调用 WMS // WMS 通过 mWindow (一个 Binder 对象) 调用应用端 mWindowSession.addToDisplay(mWindow)

综上,在 onResume 回调之后,会创建一个 ViewRootImpl ,有了它之后应用端就可以和 WMS 进行双向调用了。同时也是通过 ViewRootImpl 从 WMS 申请 Surface 来绘制 ViewTree 。

onActivityResult 在哪两个生命周期之间回调

onActivityResult 不属于 Activity 的生命周期,一般被问到这个问题时大家都会懵逼。其实答案很简单,onActivityResult 方法的注释中就写着答案:You will receive this call immediately before onResume() when your activity is re-starting. 跟一下代码(TransactionExecutor.execute 有兴趣的可以自己打断点跟一下),会发现 onActivityResult 回调先于该 Activity 的所有生命周期回调,从 B Activity 返回 A Activity 的生命周期调用为: B.onPause -> A.onActivityResult -> A.onRestart -> A.onStart -> A.onResume

onCreate 方法里写死循环会 ANR 吗

ANR 的四种场景:

Service TimeOut: service 未在规定时间执行完成: 前台服务 20s,后台 200sBroadCastQueue TimeOut: 未在规定时间内未处理完广播:前台广播 10s 内, 后台 60s 内ContentProvider TimeOut: publish 在 10s 内没有完成Input Dispatching timeout: 5s 内未响应键盘输入、触摸屏幕等事件

我们可以看到,Activity 的生命周期回调的阻塞并不在触发 ANR 的场景里面,所以并不会直接触发 ANR。只不过死循环阻塞了主线程,如果系统再有上述的四种事件发生,就无法在相应的时间内处理从而触发 ANR。

总结

Activity 的生命周期很基础而且也很重要,这也是面试常问的原因。相关的面试题可以涉及到 framework 的一些知识,平常在处理一些问题的时候最好不要只是打下日志看下结果,多钻进去源码看看,才能有更多收获,也记得更牢。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。