安卓中高級(jí)開發(fā)高頻面試題之——activity 的啟動(dòng)流程

這段時(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)架圖,要能畫出這張圖


上圖就是大家熟知的安卓四層構(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ù)問題。

?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末窜锯,一起剝皮案震驚了整個(gè)濱河市张肾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌衬浑,老刑警劉巖捌浩,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異工秩,居然都是意外死亡尸饺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門助币,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浪听,“玉大人,你說我怎么就攤上這事眉菱〖Kǎ” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵俭缓,是天一觀的道長(zhǎng)克伊。 經(jīng)常有香客問我,道長(zhǎng)华坦,這世上最難降的妖魔是什么愿吹? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮惜姐,結(jié)果婚禮上犁跪,老公的妹妹穿的比我還像新娘椿息。我一直安慰自己,他們只是感情好坷衍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布寝优。 她就那樣靜靜地躺著,像睡著了一般枫耳。 火紅的嫁衣襯著肌膚如雪乏矾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天嘉涌,我揣著相機(jī)與錄音妻熊,去河邊找鬼。 笑死仑最,一個(gè)胖子當(dāng)著我的面吹牛扔役,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播警医,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼亿胸,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了预皇?” 一聲冷哼從身側(cè)響起侈玄,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吟温,沒想到半個(gè)月后序仙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鲁豪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年潘悼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爬橡。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡治唤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出糙申,到底是詐尸還是另有隱情宾添,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布柜裸,位于F島的核電站缕陕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏疙挺。R本人自食惡果不足惜榄檬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望衔统。 院中可真熱鬧,春花似錦、人聲如沸锦爵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)险掀。三九已至沪袭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間樟氢,已是汗流浹背冈绊。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留埠啃,地道東北人死宣。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像碴开,于是被迫代替她去往敵國(guó)和親毅该。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容