這段時(shí)間整個(gè)行業(yè)都比較低迷。互聯(lián)網(wǎng)行業(yè)在大爆發(fā)后嗽冒,終于也隨著2018年冬天的到來也迎來了互聯(lián)網(wǎng)行業(yè)的冬天。很多公司都在裁員补履,包括BAT美團(tuán)滴滴京東在內(nèi)的大公司添坊,都走過了爆發(fā)期。是該到了平穩(wěn)期了箫锤,因?yàn)榇蟊l(fā)讓公司把更多的注意力都放在了市場(chǎng)和盈利上贬蛙,忘記了互聯(lián)網(wǎng)的根本是服務(wù)問題雨女。希望在平穩(wěn)期,各個(gè)公司能規(guī)范行業(yè)規(guī)則阳准,更好更優(yōu)質(zhì)的服務(wù)大眾服務(wù)社會(huì)氛堕。
因?yàn)榇竺娣e裁員,導(dǎo)致很多人在年關(guān)將近的時(shí)候野蝇,不得不重新走上求職路讼稚。我也收到了很多小伙伴發(fā)來的疑惑。其中有一個(gè)非常高頻(我知道這個(gè)題非常高頻绕沈,但是我自己也沒有能完全詳細(xì)理解并能完整的講給大家聽锐想,所以我一直沒有出這篇文章)的面試題,activity的啟動(dòng)流程乍狐。
這個(gè)題真的讓很多面試者都沒能完美的征服面試官赠摇。不是大家不知道,也不是大家沒有準(zhǔn)備這道題浅蚪。真的是這個(gè)流程如果詳細(xì)說藕帜,真的非常復(fù)雜,難以完全理解惜傲;而只靠強(qiáng)迫記憶洽故,還是沒辦法描述好。
我相信很多人從各個(gè)地方都查過activity的啟動(dòng)流程:
具體來說執(zhí)行流程及方法如下:
Intrumentation-------------->execStartActivity()
|
ActivityManagerProxy------>startActivity()
|
ActivityManagerService---->startActivity()
|
ActivityStackSupervisor---->startActivityMyWait()
|
|PackageManagerService----->resolveIntent()
|掃描app操漠,注冊(cè)組件
|
ActivityStackSupervisor----->startActivityLocked()
|
|驗(yàn)證intent收津、Class、Permission等
|
|保存將要啟動(dòng)的Activity的Record
|
ActivityStackSupervisor------>startActivityUncheckedLocked()
|
|檢查將要啟動(dòng)的Activity的launchMode和啟動(dòng)Flag
|根據(jù)launcheMode和Flag配置task
|
ActvityStack--------->startActivityLocked
|
|任務(wù)棧歷史棧配置
|
ActivityStack---------> resumeTopActivityInnerLocked()
|
|查找要進(jìn)入暫停的Activity
|
ActivityStack---------->startPausingLocked()
|
|通過ipc告訴要暫停的Activity進(jìn)入暫停
|
ActivityThread----------> handlePauseActivity()
|
|1正式讓之前的Activity暫停
|2 告訴AMS已經(jīng)暫停完成
|
ActivityManagerService--------->activityPaused()
|
ActivityStack------------->activityPausedLocked()
|
ActivityStackSuperVisor------>resumeTopActivitiesLocked()
|
ActivityStack----------------> resumeTopActivityLocked()
|
|驗(yàn)證是否該啟動(dòng)的Activity所在進(jìn)程和app是否存在浊伙,若存在,直接啟動(dòng)
|否則长捧,準(zhǔn)備創(chuàng)建該進(jìn)程
|
ActivityStackSuperVisor------> startSpecificActivityLocked()
|
|該進(jìn)程不存在嚣鄙,創(chuàng)建進(jìn)程
|
ActivityManagerService--------> startProcessLocked()
|
ActivityManagerService-------> startProcessLocked()
|
|通過Process.start(“android.app.ActivityThread”)啟動(dòng)進(jìn)程
|
ActivityThread--------->main()
|
ActivityThread--------->attach
|
IActivityManager-------->attachApplication()
|
ActivityStackSuperVisor------> attachApplicationLocked()
|
|準(zhǔn)備啟動(dòng)應(yīng)用,先查找MainActivity
|
ActivityStackSuperVisor------>realStartActivityLocked()
|
|IPC通知ActivityThread
|
ActivityThread----------> scheduleLaunchActivity()
以上就是一個(gè)應(yīng)用的啟動(dòng)流程串结。我相信很多人都看過哑子,也強(qiáng)迫自己記憶過。但是到了面試的時(shí)候肌割,還是不能回答好卧蜓。因?yàn)椴焕斫膺@個(gè)過程,記不住把敞。
那么我是怎么怎么回答面試官的呢弥奸?
首先我得承認(rèn)我回答也并不完美。我知道的很難描述表達(dá)給面試官和各位奋早。但是我抓住了面試官問這道題的初衷盛霎。其實(shí)我可以很明確的告訴你赠橙,你就是回答不正確,回答不完整愤炸,或者你把這些方法都按順序回答正確了期揪,面試官也不一定就覺得你回答的好。究其原因在于面試官文這個(gè)問題的初衷是考察面試人員對(duì)于安卓四層構(gòu)架的理解及調(diào)用過程规个。說白了凤薛,如果能對(duì)安卓四層構(gòu)架理解通信交互理解的多的話,這道題以及很多題交互問題都解決了诞仓。
其實(shí)但凡安卓通信交互的缤苫,大多數(shù)(我所知道的都是)是從application層到framework層,再到libraries層狂芋,再到Linux層榨馁,然后再逆序返回來(Linux層到libraries層到framework層到application層)的一個(gè)過程。
Activity啟動(dòng)也不例外帜矾,就是從application告訴framework翼虫,你用資源管理器活動(dòng)管理通知管理器等等,然后再開辟資源屡萤,驅(qū)動(dòng)的一些列有序的活動(dòng)珍剑。(備注:這個(gè)過程非常復(fù)雜,我因?yàn)樽鲞^藍(lán)牙和WiFi死陆,所以大致知道藍(lán)牙WiFi的流程招拙,所以我會(huì)類比來說,但是理解還是不夠措译,在這里我就不細(xì)說這個(gè)流程别凤,我教大家一個(gè)快速記憶并且能過著一道題的方法)
上圖就是大家熟知的安卓四層構(gòu)架领虹,希望大家不僅能畫出來四層來规哪,還要知道每一層有哪些結(jié)構(gòu)。小的方面也要能知道并且畫出來塌衰。這個(gè)畫出來后诉稍,這個(gè)東西知道的越多,你在安卓方面知道的也就越多(當(dāng)然疑問最疆,不知道的也會(huì)更多杯巨,我現(xiàn)在就感覺我自己越來越對(duì)安卓什么都不懂,什么都不會(huì)的感覺努酸。沒有了當(dāng)初初生牛犢不怕虎的那種感覺了服爷。感覺什么都要查,都要再三確認(rèn)才去寫〔惴觯可能優(yōu)化的需求和測(cè)試給我留下的烙印吧箫章。)。
好了回歸標(biāo)題镜会,activity啟動(dòng)流程檬寂,如果不能自己從構(gòu)架上和驅(qū)動(dòng)原理上來理解,那么我給大家簡(jiǎn)單整理一下戳表,方便你死記硬背桶至,不至于對(duì)這個(gè)問題太窘迫。
其實(shí)就這幾個(gè)方面來記匾旭。這幾個(gè)大方面記住后镣屹,具體的方法能記住幾個(gè)就好了,面試官也不都記得的价涝。你要用你的理解去明白告訴他女蜈,而不是具體的方法是什么。
一:ActivityManagerService(ActivityManagerNative)
ActivityManagerService(以后簡(jiǎn)稱AMS):AMS是Android中最核心的服務(wù)色瘩,主要負(fù)責(zé)系統(tǒng)中四大組件的啟動(dòng)伪窖、切換、調(diào)度及應(yīng)用進(jìn)程的管理和調(diào)度等工作居兆,其職責(zé)與操作系統(tǒng)中的進(jìn)程管理和調(diào)度模塊相類似覆山,它在Android中非常重要。
想深入了解可以參見這個(gè)鏈接:https://blog.csdn.net/wf_fln/article/details/78593051
二ActivityStackSupervisor?? 管理整個(gè)手機(jī)任務(wù)棧
它是棧的大管家 ActivityStackSupervisor泥栖。ActivityStackSupervisor在AMS(就上面的那個(gè)東東)中的構(gòu)造方法中被創(chuàng)建簇宽。?
三:ActivityStack?? Activity的棧(任務(wù)棧)
它是一個(gè)管理類,用來管理系統(tǒng)所有Activity的各種狀態(tài)吧享。
四:PackageManagerService(完成組件在清單里的掃描和注冊(cè))
它負(fù)責(zé)系統(tǒng)中Package的管理魏割,應(yīng)用程序的安裝、卸載钢颂、信息查詢等见妒。定義了服務(wù)端和客戶端通信的業(yè)務(wù)函數(shù),還定義了內(nèi)部類Stub甸陌,該類從Binder派生并實(shí)現(xiàn)了IPackageManager接口。因此PackageManagerService將作為服務(wù)端參與Binder通信盐股。
當(dāng)然還有其他功能钱豁,具體可以參見這篇文章:https://www.cnblogs.com/chenlong-50954265/p/5729553.html
五:ActivityThread(安卓java應(yīng)用層的入口函數(shù)類)
ActivitiyThread是應(yīng)用程序概念空間的一個(gè)概念,他建立了應(yīng)用進(jìn)程運(yùn)行的框架疯汁,并提供了一個(gè)IActivityThread接口作為與?Activity Manager Service的通訊接口.通過該接口AMS可以將Activity的狀態(tài)變化傳遞到客戶端的Activity對(duì)象牲尺。
想具體了解可以參見這篇文章:https://blog.csdn.net/zhangfei2018/article/details/46518615
六:ServiceManager
ActiveThread是每一個(gè)應(yīng)用程序所在進(jìn)程的主線程,循環(huán)的消息處理
ActiveThread與AcitivityManagerService的通信是屬于進(jìn)程間通信,使用binder機(jī)制
想具體了解可以參見這篇文章:https://www.cnblogs.com/muhe221/articles/4893915.html
好了其實(shí)整理一下谤碳,大方向主要就是這6個(gè)方面來實(shí)現(xiàn)activity來啟動(dòng)的溃卡。這6個(gè)方面必須記住。也必須知道主要有那些功能蜒简。功能我已經(jīng)簡(jiǎn)化的不能再簡(jiǎn)化了瘸羡。希望各位能看一下他們的具體作用然后做到心中有數(shù)(不必記住,知道你們也記不状瓴纭)犹赖。
本篇主要目的是讓你短時(shí)間內(nèi)記憶,了解activity的啟動(dòng)流程卷仑。如果想理解這個(gè)過程峻村,可以自己查看,博主在這里推進(jìn)一篇簡(jiǎn)單的博客:http://www.reibang.com/p/2bed70245c76
好了以上就是activity的啟動(dòng)流程的一些整理和我個(gè)人的理解锡凝。希望能對(duì)你有幫助粘昨。博主QQ:578161213.歡迎討論這個(gè)問題或者技術(shù)問題。
?