【亚博网赌安全有保障的】今日头条快手等大厂刨根问底之APP启动流程篇

日期:2021-04-16 00:36:01 | 人气: 71239

【亚博网赌安全有保障的】今日头条快手等大厂刨根问底之APP启动流程篇 本文摘要:面试官:你知道APP的启动流程吗面试者:知道!当在launcher上点击一个APP的时候他会挪用一个startActivity的方法,并给对应的intent设置一个new_task_flag在新的任务栈中启动activity,由于launcher也是一个APP,所以它可以直接挪用launcher的activity的startActivity的方法。

面试官:你知道APP的启动流程吗面试者:知道!当在launcher上点击一个APP的时候他会挪用一个startActivity的方法,并给对应的intent设置一个new_task_flag在新的任务栈中启动activity,由于launcher也是一个APP,所以它可以直接挪用launcher的activity的startActivity的方法。activity中的startactivity的方法内里其实会挪用instrumentation的execstartactivity方法,instrumentation是Instrumentation类的实例,每个APP都拥有一个instrumentation的实例,然后每个activity都有对这个实例的引用。Instrumentation实际上是历程关键,他可以完成对application或者activity的初始化以及生命周期的工具类。

所以我们看当activity挪用startactivity方法时,实际会挪用instrumentation中的方法execstartactivity方法。这个方法里呢实际上回挪用ActivityManagerNative.getDefault().startActivity方法,这个ActivityManagerNative.getDefault方法返回的是ActivityManagerProxy我们简称AMP,ActivityManagerNative简称AMN。这里实际发生是一次Binder的历程间通信。

亚博网赌安全有保障的

亚博网赌安全有保障的

这个AMP是ActivityManagerService简称AMS在客户端里的一个署理,也就是说当我们挪用AMN.getDefault().startActivity方法时,我们是通过AMP挪用了AMS中的startActivity方法,AMP只是署理,它不实现AMS的方法,只是通过历程间通信通报参数给AMS,有AMS来实现详细的方法。所以我们可以知道现在的流程已经从launcher的历程进入了system_server的历程里了。在AMS里,经由一系列挪用之后,挪用ActivityStack.resumeTopActivityInnerLocked方法,这个方法会找出首个还没有竣事的activity的ActivityRecord,如果没有就直接开启launcher法式,如果有则需要使收个activity进入pause状态,因为我们是launcher点击APP的,所以这里会通知launcher的activity进入pause状态。

所以这里需要AMS和launcher历程举行通信。使用的方法是thread.schedulePauseActivitity方法,这个方法是applicationThreadProxy的方法,这个applicationThreadProxy是applicationThread在客户端的署理,此时AMS是客户端,launcher是服务端。所以通过历程通信最终挪用到了applicationThread的方法,这个方法里会挪用queueOrSendMessage方法通知需要暂停activity,这个方法内里其实使用mH来发送一个暂停activity的消息,这个方法里做了三件事:第一件:当userLeaving为true的时候,则挪用performUserLeavingActivity来通知activity,用户要脱离了;第二件:perforPauseActivity来挪用instrumentation.callActivityOnPause方法来让activity进入pause状态,这里验证了instrumentation是activity生命周期的工具类。第三件:当activity进入pause状态之后,通知AMS已经进入pause状态乐成,这依然是一个历程间通信,通过AMP完成。

这时候历程的跨越已经从launcher历程又回到了system_server历程。在actvityPaused方法中经由一系列挪用之后,会挪用ActivityStackSupervisor.startSpecificActivityLocked方法,这个方法会获取ProcessRecord来获取APP的历程信息,如果存在历程信息,则说明APP历程已经存在,这时候直接打开APP即可;如果不存在,则挪用startprocesslocked建立新的历程,这内里其实会挪用Process.start方法建立历程。

由于Zygote历程会通过runSelectLoop方法不停的轮训socket请求,当收到建立历程的请求之后会执行runOnce方法fork一个新子历程,之后会挪用handleChildProc方法,这个方法内里会挪用RuntimeInit.zygoteInit方法,然后使用反射的方法执行ActivityThread的main方法。在ActvityThread的main方法中,会先初始化mainLooper,然后实例化一个ActivityThread,实例化的时候会建立好一个Handler类mH,最后让消息机制运行起来,开始吸收消息事件。其实在在执行Loop.looper方法之前,会先挪用ActivityThread的attach方法,这个方法会挪用AMN.getDefault()获得AMP,然后绑定一个ApplicationThread类型的Binder工具,用于AMS对这个新APP历程的通信。

亚博网赌安全有保障的

亚博网赌安全有保障的

当AMS获得一个ApplicationThread类型的工具之后,通过挪用thread.scheduleLuncherActivity开始真正的启动一个activity,当ApplicationThread收到这个消息之后,建立一个ActivityRecord工具,并初始化它的成员变量,然后挪用ActivityThread的queueOrSendMessage方法,通知launcherActivity,这里使用的就是mH发送消息事件,凭据ActivityRecord记载的信息,建立activity。此时历程已经切换到了新APP的历程了。执行performLunchActivity方法,这个方法里1、搜集activity的信息,主要是packageInfo和component;2、通过classLoader将activity加载起来3、建立Application,主要剖析Mainifest文件里的信息4、建立activity的上下文信息,并绑定到activity内里;5、最后挪用instrumentation.callActivityOnCreate方法终于Activity建立乐成了,最后通过handleResumeActivity方法回调Activity的onResume方法,Activity终于能泛起在眼前了。总结:app的启动流程设计知识点许多,挪用链很长,面试者可以自己总结一套自己熟悉的谜底出来会比力好,否则面试官会感受你的背谜底。

另外呢,由于知识许多,可能会被面试打断问其他的问题,所以涉及的一些知识也需要掌握。好比:适才你说到了好频频Binder,你熟悉Binder吗?为什么历程通信要用Binder,不使用linux其他的历程通信方式呢?(Linux也有很历程通信的方式)适才你讲到在和zygote通信的时候是用的socket,这里为什么不选择Binder呢?mH handler是什么时候建立的,你相识Handler吗?最后祝大家面试顺利,早日拿到自己心仪的offer岗位内推、学习交流我们大量需要前端岗位、Java 岗位、Android 和 iOS 的开发岗位,事情所在:杭州阿里巴巴,由于社招最低要求是 P6 起,所以需要至少 3 年以上事情履历。关注+转发+私信我【学习】如果你以为自己学习效率低,缺乏正确的指导,可以加入资源富厚,学习气氛浓重的技术圈一起学习交流吧!群内有许多来自一线的技术大牛,也有在小厂或外包公司奋斗的码农,我们致力打造一个平等,高质量的Android交流圈子,纷歧定能短期就让每小我私家的技术突飞猛进,但从久远来说,眼光,格式,久远生长的偏向才是最重要的。

35岁中年危机大多是因为被短期的利益牵着走,过早压榨掉了价值,如果能一开始就树立一个正确的久远的职业计划。35岁后的你只会比周围的人更值钱。


本文关键词:亚博网赌安全有保障的

本文来源:亚博网赌安全有保障的-www.bbbn0.com

产品中心